2017-09-16 2 views
1

Je viens de commencer à explorer Jsoup et j'ai rencontré le problème suivant: quand j'essaie d'extraire des liens de https://en.wikipedia.org/wiki/Knowledge qui n'appartiennent qu'à la version anglaise de Wikipedia fonctionne correctement.jsoup - comment obtenir des liens à partir d'un texte d'un article dans Wikipedia

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")); 
    } 
} 

Cependant, je suis aussi obtenir les liens qui ne font pas partie du texte de l'article en cours tels que:

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 

Quelle est la bonne façon d'obtenir que les liens de la leader du texte à d'autres articles de Wikipedia avec Jsoup?

+0

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

+1

@matoni merci.J'ai trouvé que les liens dont je n'ai pas besoin sont situés dans le 'div id =" mw-panel "'. J'ai donc édité le sélecteur pour les liens selon le livre de cuisine de jsoup comme ceci: 'Elements linksOnPage = document.select (" un [href^= \ "/ wiki/\"], div: not (.mw-panel) ")." Mais je reçois toujours les liens inutiles du panneau latéral de Wikipédia. – samba

Répondre

1

liens que je ne ai pas besoin sont situés dans le div id = "mw panneau"

Par conséquent, le sélecteur correcte serait:

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

qui choisira <a> éléments :

  • ne sont pas à l'intérieur d'un élément <div> avec mw-panel ID
  • et leur attribut href commence par "/wiki/".

EDIT:

J'ai besoin que les liens d'un article sans liens des panneaux latéraux et sans aucun lien tels que https://en.wikipedia.org/wiki/Special:BookSources/978-1-4200 -5940-3 https://en.wikipedia.org/wiki/Special:BookSources/1-58450-46 0-9

Ensuite, vous pouvez essayer:

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

Cela va analyser les liens que:

  • sont à l'intérieur de l'article (<div> avec ID de bodyContent)
  • leur href attribut commence par "/wiki/"

div#bodyContent n'a pas "/wiki/...Special:..." liens. (Si vous voulez exclure des liens avec un autre mot, ajoutez ceci à la fin du sélecteur ci-dessus sans aucun espace ni séparateur: :not([href*="something"]))

Vous pouvez également essayer de combiner des sélecteurs pour obtenir le meilleur motif d'après mes essais ci-dessus et par reading about Jsoup selectors.

code Exemple:

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()); 

Cette imprime suivante:

/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

merci @juzraai mais ça n'a pas aidé. Je n'ai besoin que des liens d'un article sans liens depuis les panneaux latéraux et sans liens tels que: '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

S'il vous plaît voir ma réponse éditée, j'ai ajouté une autre solution potentielle. – juzraai

+0

Lorsque j'essaie d'utiliser vos suggestions, il retourne juste une URL de la page initiale. Pour une raison quelconque, non seulement hrefs avec '" Special: "' est éliminé. Je devrais probablement essayer regex. – samba