2017-09-16 98 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

相关问题