2

我正在尝试从网站上抓取药物清单。我正在使用 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();
    }
}

这是我得到的输出:

输出图像

PS这不是完整的输出,但是由于我无法截取完整输出的屏幕截图,所以我只是显示了它。

我需要知道两件事:

问题 1.为什么我在每个药物名称前都有一个额外的空格,为什么我在某些药物名称后会出现额外的新行?

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

4

3 回答 3

2

一些东西:

  1. 这不是完整的输出,因为不止一页。我放了一个for循环来为你解决这个问题。
  2. 您可能应该使用修剪输出htm.trim()
  3. 您可能应该确保在有 newLine ( !htm.isEmpty())时不打印
  4. 该网站有一个奇怪的字符,其中 ASCII 值为 160。我添加了一个解决问题的小修复程序。(与.replace

这是固定代码:

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();
    }
  }
}
于 2012-12-07T14:29:57.323 回答
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();
    }
}
于 2012-12-07T14:25:22.090 回答
0

1)以风格取元素是相当危险的;

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();
    }
}
于 2012-12-07T14:49:51.667 回答