从我从网站上删除的文本中删除空白区域

时间:2012-12-07 14:21:13

标签: java jsoup

我正试图从网站上查找药品清单。 我正在使用JSOUP来解析Html。

这是我的代码:

URL url = new URL("http://www.medindia.net/drug-price/index.asp?alpha=a");
Document doc1 = Jsoup.parse(url, 0);

Elements rows = doc1.getElementsByAttributeValue("style", "padding-left:5px;border-right:1px solid #A5A5A5;");

for(Element row : rows){
    String htm = row.text();
    if(!(htm.equals("View Price")||htm.contains("Show Details"))) {
        System.out.println(htm);
        System.out.println();
    }
}

这是我得到的输出:

Output Image

P.S。 这不是完整的输出但由于我无法拍摄完整输出的屏幕截图,我只是显示了它。

我需要知道两件事:

问题1。为什么我在每个药物名称前面都有一个额外的空间?为什么我会在某些药物的名称后获得额外的新药?

问题2. 如何解决此问题?

3 个答案:

答案 0 :(得分:2)

一些事情:

  1. 这不是完整的输出,因为有多个页面。我放了一个for循环来解决这个问题。
  2. 您应该使用htm.trim()
  3. 修剪输出
  4. 当有新线(!htm.isEmpty()
  5. 时,您应该确保不打印
  6. 该网站有一个奇怪的字符,其中包含ASCII值160。我添加了一个解决问题的小修复程序。 (使用.replace
  7. 这是固定代码:

    for(char page='a'; page <= 'z'; page++) {
      String urlString = String.format("http://www.medindia.net/drug-price/index.asp?alpha=%c", page);
      URL url = new URL(urlString);
      Document doc1 = Jsoup.parse(url, 0);
      Elements rows = doc1.getElementsByAttributeValue("style", "padding-left:5px;border-right:1px solid #A5A5A5;");
      for(Element row : rows){
        String htm = row.text().replace((char) 160, ' ').trim();
        if(!(htm.equals("View Price")||htm.contains("Show Details"))&& !htm.isEmpty())
        {
          System.out.println(htm.trim());
          System.out.println();
        }
      }
    }
    

答案 1 :(得分:1)

做一件事:

在syso中使用trim功能:System.out.println(htm.trim());

更新:

经过大量的努力,我能够解析所有这80种药物: -

URL url = new URL("http://www.medindia.net/drug-price/index.asp?alpha=a");
Document doc1 = Jsoup.parse(url, 0);
Elements rows = doc1.select("td.ta13blue");
Elements rows1 = doc1.select("td.ta13black.tbold");
int cnt=0;
for(Element row : rows){
    cnt++;
    String htm = row.text().trim();
    if(!(htm.equals("View Price")||htm.contains("Show Details") || htm.startsWith("Drug"))) {
        System.out.println(cnt+" : "+htm);
        System.out.println();
    }
}
for(Element row1 : rows1){
    cnt++;
    String htm = row1.text().trim();
    if(!(htm.equals("View Price")||htm.contains("Show Details") || htm.startsWith("Drug"))) {
        System.out.println(cnt+" : "+htm);
        System.out.println();
    }
}

答案 2 :(得分:0)

1)通过 style 获取元素是非常危险的;

2)调用ROWS而不是FIELDS列表更危险:)

3)打开页面,您可以看到仅在“黑名称”之后添加额外的行,未包含在锚链接中的项目名称。

问题是,该行中的第二个字段不是Show Details也不是View Price,甚至不是空的......它是:

<td bgcolor="#FFFFDB" align="center" 
    style="padding-left:5px;border-right:1px solid #A5A5A5;">
         &nbsp;
</td>

这是一个空格字符串。像这样修改你的代码:

for(Element row : rows){
    String htm = row.text().trim(); // <!-- This one
    if(!
         (htm.equals("View Price") 
          || htm.contains("Show Details")
          || htm.equals("&nbsp;")) // <!-- And this one
       ) {
        System.out.println(htm);
        System.out.println();
    }
}