8
votes

Utilisation de XMLSluper: Comment sélectionner des sous-éléments tout en itérant sur un GPATHRESULT

J'écris un analyseur HTML, qui utilise Tagsoup pour passer une structure bien formée à XMLSluper.

Voici le code généralisé: P>

#href1#href2: Here is the addressTelephone number: telephoneHere is another addressAnother telephone: 0845 1111111
  • pourquoi je reçois la sortie montrée li>
  • Comment puis-je récupérer les paires HREF / Adresse pour chaque article "LI" LI> ul>

    merci. p> p>


0 commentaires

3 Réponses :


11
votes

Remplacez le grep avec Rechercher: xxx pré>

alors vous obtiendrez p>

html.'**'.grep { it.@class == 'divclass' }.ol.li.each {
    it.each { linkItem ->
        def link = linkItem.h3.a.@href
        def address = linkItem.address.text()
        println "$link: $address\n"
    }
}


0 commentaires

1
votes

C'était un problème délicat. Quand il n'y a qu'un seul élément avec la classe = 'divclass' la réponse précédente est bien. S'il y avait plusieurs résultats de Grep, une recherche () pour un seul résultat n'est pas la réponse. Soulignant que le résultat est une arracheliste est correct. L'insertion d'une boucle dominée externe () fournit un GPathResult dans le paramètre de fermeture div em>. À partir de là, l'exploration peut continuer avec le résultat attendu.

html."**".grep { it.@class == 'divclass' }.ol.li.each { it.each { linkItem ->
   def link = linkItem.h3.a.@href
   def address = linkItem.address
   println "$link: $address\n"
}}


0 commentaires

0
votes

Je crois que les réponses précédentes sont toutes correctes au moment de la rédaction de la version utilisée. Mais j'utilise httpbuilder 0.7.1 et Grails 2.4.4 avec Groovy 2.3.7 et il y a un gros problème - Les éléments HTML sont transformés en majuscules. Strong> Il semble que cela soit dû à Nekohtml utilisé sous la hotte. :

http://nekohtml.sourceforge.net/faq.html#uppercase P>

Pour cette raison, la solution dans la réponse acceptée doit être écrite comme suit: P>

html.'**'.find { it.@class == 'divclass' }.OL.LI.each { linkItem ->
    def link = linkItem.H3.A.@href
    def address = linkItem.ADDRESS.text()
    println "$link: $address\n"
}


0 commentaires