Question

Je souhaite analyser une page Web dans Groovy et extraire tous les liens href et le texte associé.

Si la page contenait ces liens :

<a href="http://www.google.com">Google</a><br />
<a href="http://www.apple.com">Apple</a>

le résultat serait :

Google, http://www.google.com<br />
Apple, http://www.apple.com

Je cherche une réponse Groovy.ALIAS.La manière la plus simple !

Était-ce utile?

La solution

En supposant qu'un XHTML bien formé, sculpte le xml, rassemble toutes les balises, trouve les balises 'a' et affiche le href et le texte.

input = """<html><body>
<a href = "http://www.hjsoft.com/">John</a>
<a href = "http://www.google.com/">Google</a>
<a href = "http://www.stackoverflow.com/">StackOverflow</a>
</body></html>"""

doc = new XmlSlurper().parseText(input)
doc.depthFirst().collect { it }.findAll { it.name() == "a" }.each {
    println "${it.text()}, ${it.@href.text()}"
}

Autres conseils

Une recherche rapide sur Google a révélé une possibilité intéressante, TagSoup .

Je ne connais pas Java, mais je pense que xpath est bien meilleur que les expressions régulières classiques pour obtenir un (ou plusieurs) éléments html.

Il est également plus facile d'écrire et de lire.

<html>
   <body>
      <a href="1.html">1</a>
      <a href="2.html">2</a>
      <a href="3.html">3</a>
   </body>
</html>

Avec le code HTML ci-dessus, cette expression & "; / html / body / a &"; listera tous les éléments href.

Voici un didacticiel pas à pas http: //www.zvon. org / xxl / XPathTutorial / General / examples.html

Utilisez XMLSlurper pour analyser le code HTML en tant que document XML, puis utilisez la méthode find avec une fermeture appropriée pour sélectionner les balises, puis utilisez la méthode list sur GPathResult pour obtenir une liste des balises. Vous devriez alors pouvoir extraire le texte en tant qu'enfant de GPathResult.

Essayez une expression régulière. Quelque chose comme ça devrait marcher:

(html =~ /<a.*href='(.*?)'.*>(.*?)<\/a>/).each { url, text -> 
    // do something with url and text
}

Jetez un coup d'œil à Groovy - Tutoriel 4 - Notions de base sur les expressions rationnelles et Ancrage par balise d’expression régulière .

L'analyse à l'aide de XMlSlurper ne fonctionne que si HTMl est bien formé.

Si votre page HTML contient des balises mal formées, utilisez l'expression régulière pour analyser la page.

Ex: <a href="www.google.com">

ici, « a » n'est pas fermé et donc mal formé.

 new URL(url).eachLine{
   (it =~ /.*<A HREF="(.*?)">/).each{
       // process hrefs
   }
}

Analyseur HTML + Expressions régulières Toutes les langues le feraient, même si je dirais que Perl est la solution la plus rapide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top