Verwenden von XmlSlurper: Auswählen von Unterelementen beim Iterieren über ein GPathResult

8

Ich schreibe einen HTML-Parser, der TagSoup verwendet, um eine wohlgeformte Struktur an XMLSlurper zu übergeben.

Hier ist der verallgemeinerte Code:

%Vor%

Ich würde erwarten, dass jeder mich jedes "li" auswählen lässt, damit ich die entsprechenden href- und Adressdetails abrufen kann. Stattdessen bekomme ich diese Ausgabe:

%Vor%

Ich habe verschiedene Beispiele im Internet überprüft und diese befassen sich entweder mit XML oder sind einzeilige Beispiele wie "alle Links aus dieser Datei abrufen". Es scheint, dass der it.h3.a. @ href-Ausdruck alle hrefs im Text sammelt, obwohl ich ihm einen Verweis auf den übergeordneten li-Knoten übergebe.

Können Sie mich wissen lassen:

  • Warum bekomme ich die Ausgabe
  • ?
  • Wie kann ich die href / address-Paare für jedes li-Objekt
  • abrufen?

Danke.

    
Andrew Whitehouse 04.11.2009, 17:51
quelle

3 Antworten

11

Ersetze grep mit find:

%Vor%

Dann wirst du

bekommen %Vor%

grep gibt eine ArrayList zurück, aber find gibt eine NodeChild-Klasse zurück:

%Vor%

ergibt:

%Vor%

Wenn du also grep benutzen willst, könntest du einen anderen so verschachteln, damit es funktioniert

%Vor%

Lange Rede kurzer Sinn, benutze in deinem Fall lieber find als grep.

    
mbrevoort 05.11.2009, 05:48
quelle
1

Das war eine schwierige Frage. Wenn es nur ein Element mit class = 'divclass' gibt, ist die vorherige Antwort in Ordnung. Wenn es mehrere Ergebnisse von grep gibt, ist ein find () für ein einzelnes Ergebnis nicht die Antwort. Es ist richtig, dass das Ergebnis eine ArrayList ist. Das Einfügen einer äußeren verschachtelten .each () - Schleife stellt ein GPathResult im Verschlussparameter div bereit. Von hier aus kann der Drilldown mit dem erwarteten Ergebnis fortgesetzt werden.

%Vor%

Das Verhalten des ursprünglichen Codes kann auch ein bisschen mehr Erklärung verwenden. Wenn auf eine Liste in Groovy auf eine Eigenschaft zugegriffen wird, erhalten Sie eine neue Liste (gleiche Größe) mit der Eigenschaft jedes Elements in der Liste. Die von grep () gefundene Liste hat nur einen Eintrag. Dann erhalten wir einen Eintrag für die Eigenschaft ol , was in Ordnung ist. Als nächstes erhalten wir das Ergebnis von ol.it für diesen Eintrag. Es ist wieder eine Liste von size () == 1, aber diesmal mit einem Eintrag von size () == 2. Wir könnten die äußere Schleife dort anwenden und das gleiche Ergebnis erhalten, wenn wir wollen:

%Vor%

Bei jedem GPathResult, das mehrere Knoten repräsentiert, erhalten wir die Verkettung des gesamten Textes. Das ist das ursprüngliche Ergebnis, zuerst für @href , dann für Adresse .

    
eddelplus 25.04.2013 16:12
quelle
0

Ich glaube, dass die vorherigen Antworten zum Zeitpunkt des Schreibens für die verwendete Version alle korrekt waren. Aber ich verwende HTTPBuilder 0.7.1 und Grails 2.4.4 mit Groovy 2.3.7 und es gibt ein großes Problem - HTML-Elemente werden in Großbuchstaben umgewandelt. Es scheint, dass dies auf NekoHTML zurückzuführen ist, das unter der Haube verwendet wird :

Ссылка

Aus diesem Grund muss die Lösung in der angenommenen Antwort wie folgt geschrieben werden:

%Vor%

Dies war sehr frustrierend zu debuggen, hoffe, es hilft jemandem.

    
Philip 02.03.2015 00:36
quelle

Tags und Links