2017-09-16 64 views
1

我剛剛開始探索Jsoup並面臨以下問題:當我嘗試從僅屬於維基百科英文版的https://en.wikipedia.org/wiki/Knowledge中提取鏈接時,正常工作。jsoup - 如何從維基百科文章的文本中獲取鏈接

Document document = Jsoup.connect("https://en.wikipedia.org/wiki/Knowledge").timeout(6000).get(); 
    Elements linksOnPage = document.select("a[href^=\"/wiki/\"]"); 

    for (Element link : linksOnPage) { 
     System.out.println("link : " + link.attr("abs:href")); 
    } 
} 

不過我也越來越不屬於當前的物品,如文本鏈接:

link : https://en.wikipedia.org/wiki/Main_Page 
    link : https://en.wikipedia.org/wiki/Portal:Contents 
    link : https://en.wikipedia.org/wiki/Portal:Featured_content 
    link : https://en.wikipedia.org/wiki/Portal:Current_events 
    link : https://en.wikipedia.org/wiki/Special:Random 
    link : https://en.wikipedia.org/wiki/Help:Contents 
    link : https://en.wikipedia.org/wiki/Wikipedia:About 
    link : https://en.wikipedia.org/wiki/Wikipedia:Community_portal 

什麼是讓只從文本領先的鏈接的正確方法到Jsoup的其他維基百科文章?

+0

https://jsoup.org/cookbook/extracting-data/selector-syntax – matoni

+1

@matoni感謝。我發現我不需要的鏈接位於'div id =「mw-panel」'中。所以我根據jsoup cookbook編輯鏈接的選擇器,如下所示:元素linksOnPage = document.select(「a [href^= \」/ wiki/\「],div:not(.mw-panel) 「);'。但我仍然從維基百科側面板上獲得不需要的鏈接。 – samba

回答

1

,我不需要位於DIV ID鏈接= 「MW-面板」

因此,正確的選擇應該是:

div:not(#mw-panel) a[href^="/wiki/"] 

這將選擇<a>元素:

  • 不在<div>元素內,mw-panel ID
  • 及其href屬性以"/wiki/"開頭。

編輯:

我只需要而不從側面板連接,沒有任何鏈接,如https://en.wikipedia.org/wiki/Special:BookSources/978-1-4200 -5940-3 https://en.wikipedia.org/wiki/Special:BookSources/1-58450-46 0-9

的從文章鏈接

那麼你可以嘗試:

#bodyContent a[href^="/wiki/"] 

這將解析鏈接是:

  • 是文章(<div>bodyContent ID)內
  • 他們href屬性與"/wiki/"

div#bodyContent開始沒有"/wiki/...Special:..."鏈接。 (如果你想排除一些其他詞的鏈接,將其附加到上面的選擇器的末尾,沒有任何空格或分隔符::not([href*="something"])

你也可以嘗試結合選擇器來實現最佳模式,根據我上面的測試和reading about Jsoup selectors

示例代碼:

String url = "https://en.wikipedia.org/wiki/Knowledge"; 
Document document = Jsoup.connect(url).timeout(6000).get(); 
Elements links = document.select("#bodyContent a[href^=\"/wiki/\"]"); 
for (Element e : links) { 
    System.out.println(e.attr("href")); 
} 
System.out.println("Links found: " + links.size()); 

此打印出以下:

/wiki/Knowledge_(disambiguation) 
/wiki/Fact 
/wiki/Information 
... 
/wiki/Category:Articles_with_unsourced_statements_from_September_2007 
/wiki/Category:Articles_with_unsourced_statements_from_May_2009 
/wiki/Category:Wikipedia_articles_with_GND_identifiers 
Links found: 826 
+0

謝謝@juzraai但它沒有幫助。我只需要一篇沒有鏈接的文章鏈接,並且沒有任何鏈接,如:https://en.wikipedia.org/wiki/Special:BookSources/978-1-4200-5940-3' ' https://en.wikipedia.org/wiki/Special:BookSources/1-58450-460-9' – samba

+0

請參閱我編輯的答案,我添加了另一個可能的解決方案。 – juzraai

+0

當我嘗試使用您的建議時,它只返回初始頁面的一個網址。出於某種原因,不僅有「Special:」的hrefs被取消。我應該嘗試正則表達式。 – samba

相關問題