使用JSoup解析href值的链接适用于单个链接,但不适用于链接数组

时间:2014-10-12 14:36:20

标签: java html-parsing jsoup

我已成功使用JSoup抓取href链接。我还设法获取单个链接的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
....

我知道Elements类型的links数组有正确的数据,如果我尝试打印链接数组中的元素,它会显示所有的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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

}