2012-12-07 59 views
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(); 
    } 
} 

这里是我得到的输出:

Output Image

附: 这不是完整的输出但由于我不能完整输出的屏幕截图,我只是显示它。

我需要知道两件事情:

问题1:为什么我会得到一个额外的空间在每个药品名称的前面,为什么我获得额外新线有些药物的名称后?

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

+0

使用.trim()从开头和结尾删除不需要的空格。 – specialscope

+0

@specialscope它没有删除空格,IDK为什么! –

回答

2

几件事:

  1. 这不是完整的输出,因为有多个页面。我把一个for循环修复了你。
  2. 你或许应该修剪使用htm.trim()
  3. 输出你也许应该确保当有一个换行符(!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(); 
    } 
    } 
} 
+0

我知道它不是完整的输出,因为现在我无法处理Alpha = a的值,那么处理所有这些值到z的值是什么。 此外你的代码似乎不能解决问题。我尝试过这个。 –

+0

我没有在这台电脑上安装JSoup。究竟出了什么问题?你能更好地解释哪些元素没有被打印? – durron597

+0

之前每个药物名称有一个空格和某些名称后有一个额外的行打印,该行只有一个空白字符,我相信这是由于 ,但我无法删除它。 –

1

做一两件事:System.out.println(htm.trim());

更新::

使用在syso微调功能

经过了很多努力,我能够解析所有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(); 
    } 
} 
+0

抱歉,但它不起作用。在我的情况下 –

+0

仍然不起作用 –

+0

如果我使用Class = ta13blue,它将跳过class = ta13black粗体的所有元素。所以我认为你的代码不会解决这个问题。 –

0

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

2)调用ROWS什么,而不是为字段列表是更加危险的:)

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(); 
    } 
} 
+0

已经尝试过,但它没有帮助 –

+0

这是做什么的替代方法? –

+0

请再试一次。 –