2014-10-12 95 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 

}