2014-10-12 79 views
0

我已成功使用JSoup获取href链接。我也设法获取单个链接的href的相对值和绝对值。如下图所示:使用JSoup为href值解析链接适用于单个链接,但不适用于链接数组

//works perfectly, website: bbc.co.uk 
Document document = Jsoup.connect(url).get(); 
Element link = document.select("a").last(); 
String relHref = testlink.attr("href"); 
String absHref = testlink.attr("abs:href"); 
System.out.println(relHref); 
System.out.println(absHref); 

//output: 
relHref: /help/web/links/ 
absHref: http://www.bbc.co.uk/help/web/links/ 

我甚至可以使用Element link = document.select("a").first();,这也适用。但是,当我尝试在一个循环中添加它以迭代所有抓取的链接并打印出每个链接时,它不会给我预期的结果。这里是我的代码:

//not working 
Elements links = document.select("a"); 
for(int i=0; i<links.size(); i++){ 
     String relHref = links.attr("href"); 
     String absHref = links.attr("abs:href"); 
     System.out.println(relHref); 
     System.out.println(absHref); 
    } 
//output 
http://m.bbc.co.uk 
http://m.bbc.co.uk 
http://m.bbc.co.uk 
.... 

我知道类型的链接数组元素具有正确的数据,如果我尝试并打印链接数组中的元素它会显示所有的href标签,即

for (Element link : links) { 
     System.out.println(link); 
    } 
//output 116 links: 

<a href="http://m.bbc.co.uk">mobile site</a> 
<a href="/"> <img src="http://static.bbci.co.uk/frameworks/barlesque/2.72.5/orb/4/img/bbc-blocks-dark.png" width="84" height="24" alt="BBC"> </a> 
<a href="#h4discoveryzone">Skip to content</a> 
<a id="orb-accessibility-help" href="/accessibility/">Accessibility Help</a> 
.... 

但是,我如何获得一个数组的relHref和absHref的工作?相反,我的代码只是一遍又一遍地打印出第一个链接。我一直在这个好几个小时,所以我可能在某个地方犯了一个愚蠢的错误,但帮助表示赞赏!

谢谢。

回答

2

在此行中:

String relHref = links.attr("href"); 

...它应该如何知道你在谈论的i个链接? (它不:Elements#attr始终返回Elements集合中的第一项的值。)

你想

String relHref = links.get(i).attr("href"); 

...这让你有兴趣通过特定链接Elements#get,然后使用Node#attr就可以了。

这就是说,虽然,我只想用增强for循环:

for (Element link : document.select("a")) { 
    String relHref = link.attr("href"); 
    String absHref = link.attr("abs:href"); 
    System.out.println(relHref); 
    System.out.println(absHref); 
} 

...除非你需要i的东西。

+0

完美的作品,非常有意义。我错误地认为,因为我遍历链接数组,它会获取适当的值(尊重索引)。无论如何感谢T.J! – gudthing 2014-10-12 14:53:54

+0

@gudthing:不客气。正如你接受的那样,我正在添加一个替代品,所以你可能想要刷新。 – 2014-10-12 14:55:00

+1

再次感谢,我确实尝试了一个先进的循环,但我直接将该类型设置为'链接',这不起作用,所以我非常欣赏看到另一种解决方案!谢谢,你一直非常有帮助! – gudthing 2014-10-12 15:07:01

1

您需要在for循环中使用Elements方法get(int index)来获取元素所持有的每个元素。

例如,

Elements links = document.select("a"); 
for(int i=0; i < links.size(); i++) { 
    Element ele = links.get(i); 

    /// use ele here to extract info from each Element 

}