2009-07-12 3 views
2

Ich arbeite an etwas Code, der eine Seite für zwei CSS-Klassen auf einer Seite scrapt. Ich bin einfach die Hpricot Suchmethode für diese Verwendung als so:Hpricot CSS Klassensuche

webpage.search("body").search("div.first_class | div.second_class") 

... für jedes Element finde ich ein Objekt erstellen und es in ein Array setzen, das funktioniert toll, bis auf eine Sache.

Die Suche wird durch die gesamte HTML-Seite gehen und jedes Mal ein Objekt in ein Array einfügen, wenn sie auf ".first_class" stößt. Dann wird das Dokument erneut durchsucht und nach ".second_class" gesucht enthält alle gesuchten Objekte in der falschen Reihenfolge im Array, dh alle '.first_class'-Objekte, gefolgt von allen' .second_class'-Objekten.

Gibt es eine Möglichkeit, dass ich das Dokument in einem Schritt durchsuchen und ein Objekt in das Array jedes Mal hinzufügen kann, wenn es eine der angegebenen Klassen trifft, gibt mir ein Array von Elementen in der Reihenfolge sie sind rüberkommen auf der Seite, die ich schabe?

Jede Hilfe sehr geschätzt. Dank

Antwort

1

Ok, so stellte sich heraus, dass ich mich geirrt hatte und das machte nichts anderes als das, was ich vorher überhaupt hatte. Allerdings habe ich mir eine Lösung ausgedacht, ob sie am besten geeignet ist oder nicht, da bin ich mir nicht sicher. Es scheint jedoch ziemlich einfach für ein lästiges Problem zu sein.

ich die Suche nach den beide oben genannten Klassen jetzt durchführen, wie ich oben erwähnt:

webpage.search("body").search("[@class~='first_class']|[@class~='second_class']") 

jedoch noch das ein Array zurückgegeben zunächst mit einer Klasse von ‚first_class‘, gefolgt von alle divs mit einem all divs enthält Klasse von 'second_class'. Um dies zu beheben und ein Array von allen Elementen zu erhalten, so wie sie in der Reihenfolge auf der Seite erscheinen, kette ich einfach die 'add_class'-Methode mit meiner eigenen benutzerdefinierten Klasse, z. 'foo_bar'. Dies ermöglicht dann mir noch eine Suche auf der Seite für alle divs ausführen mit nur diesem einen Tag, so dass ein Array aller Einzelteile zurück i nach bin, in der Reihenfolge, wie sie auf der Seite erscheinen.

webpage.search("body").search("[@class~='first_class']|[@class~='second_class']").add_class("foo_bar") 

webpage.search("body").search("[@class~='foo_bar']") 
1

Siehe Abschnitt hier auf „Prüfen auf ein paar Attribute“:

http://wiki.github.com/why/hpricot/hpricot-challenge

Sie sollten in der Lage, die Elemente in der gleichen Art und Weise zu stapeln, wie Sie Attribute tun. Diese Funktion ist offensichtlich möglich in Hpricot-Versionen nach 2006 17. März ... Ein Beispiel mit Elementen ist:

0

Danke für den Tipp. Ich hatte das in der Dokumentation nicht entdeckt und fand auch eine andere Seite, die ich noch nicht gesehen hatte. Ich habe dies mit der folgenden Zeile festgelegt:

webpage.search("body").search("[@class~='first_class']|[@class~='second_class']") 

Dies fügt nun ein Objekt in das Array jedes Mal, es über eine der oben genannten Klassen in dem Dokument geht. Brillant!

Verwandte Themen