Scrapy mit XPath -Selektoren

Scrapy mit XPath -Selektoren
HTML ist die Sprache der Webseiten, und zwischen den Öffnungen und Schließen jeder Webseite hängen viele Informationen html Schild. Es gibt viele Möglichkeiten, darauf zugreifen zu können.

Die Scrapy Library ist eine sehr leistungsstarke Web -Scraping -Bibliothek, die ebenfalls einfach zu bedienen ist. Wenn Sie neu sind, können Sie das verfügbare Tutorial zur Verwendung der Scrapy Library befolgen.

Dieses Tutorial deckt die Verwendung von XPath -Selektoren ab. XPath verwendet Pfad -Syntax, um die Knoten von XML -Dokumenten zu navigieren. Sie sind auch nützlich bei der Navigation von HTML -Tags.

Im Gegensatz zum Tutorial im Scrapy werden wir alle unsere Operationen hier auf dem Terminal zum Einfachheit halber ausführen. Dies bedeutet nicht, dass der XPath nicht mit dem richtigen Scrapy -Programm verwendet werden kann. Sie können in der Parse -Bibliothek für den Antwortparameter verwendet werden.

Wir werden mit dem Beispiel arbeiten.Webcraping.com site, da es sehr einfach ist und hilft, die Konzepte zu verstehen.

Um Scrapy in unserem Terminal zu verwenden, geben Sie den folgenden Befehl ein:

$ Scrapy Shell http: // Beispiel.Webcraping.com

Es würde die Website besuchen und die erforderlichen Informationen erhalten, und lassen uns dann mit einer interaktiven Hülle zum Arbeiten lassen. Sie sollten eine Eingabeaufforderung sehen wie:

In 1]:

Aus der interaktiven Sitzung werden wir mit dem zusammenarbeiten Antwort Objekt.

So würde unsere Syntax für den größten Teil dieses Artikels aussehen:

In [1]: Antwort.XPath ('xpathsyntax').Extrakt()

Dieser obige Befehl wird verwendet, um alle übereinstimmenden Tags gemäß der XPath -Syntax zu extrahieren und sie dann in einer Liste zu speichern.

In [2]: Antwort.XPath ('xpathsyntax').extract_first ()

Dieser obige Befehl wird verwendet, um nur das erste übereinstimmende Tag zu extrahieren und speichert es in einer Liste.
Wir können jetzt anfangen, an der XPath -Syntax zu arbeiten.

Navigierende Tags

Navigierende Tags in XPath ist sehr einfach, alles, was benötigt wird.

In [3]: Antwort.XPath ('/html').Extrakt()

Der obige Befehl würde die zurückgeben html Tag und alles, was es als einzelnes Element in einer Liste enthält.

Wenn wir den Körper der Webseite erhalten möchten, würden wir Folgendes verwenden:

In [4]: ​​Antwort.xPath ('/html/body').Extrakt()

XPath ermöglicht auch dem Wildcard -Charakter "*", das alles in dem Niveau entspricht, in dem es verwendet wird.

In [5]: Antwort.XPath ('/*').Extrakt()

Der obige Code würde im Dokument mit allem übereinstimmen. Das gleiche passiert, wenn wir '/html' verwenden.

In [6]: Antwort.XPath ('/html/*').Extrakt()

Durch die Navigation von Tags können wir alle Nachkommens -Tags eines bestimmten Tags erhalten, indem wir die "//" verwenden.

In [7]: Antwort.XPath ('/html // a').Extrakt()

Der obige Code würde alle Anker -Tags im HTML -Tag i zurückgeben.e. Es würde eine Liste aller Nachkommen -Anker -Tags zurückgeben.

Tags nach Attributen und ihre Werte

Manchmal kann das Navigieren von HTML -Tags, um zum erforderlichen Tag zu gelangen. Dieses Problem kann abgewendet werden, indem einfach das benötigte Tag durch sein Attribut gefunden wird.

In [8]: Antwort.xPath ('/html // div [@id = "pagination"]').Extrakt()

Der obige Code gibt alle zurück div Tags unter dem html Tag, die die haben Ausweis Attribut mit einem Wert von Seitennummerierung.

In [9]: Antwort.XPath ('/html // div [@class = "span12"]')).Extrakt()

Der obige Code würde eine Liste aller zurückgeben div Tags unter dem HTML -Tag, nur wenn sie das Klassenattribut mit einem Wert von haben Span12.

Was ist, wenn Sie den Wert des Attributs nicht kennen? Und alles, was Sie wollen, ist, Tags mit einem bestimmten Attribut zu erhalten, ohne dass sich der Wert befasst. Dies ist auch einfach, nur das @ -Symbol und das Attribut zu verwenden.

In [10]: Antwort.XPath ('/html // div [@class]')).Extrakt()

Dieser Code würde eine Liste aller Div -Tags zurückgeben, die das Klassenattribut enthalten, unabhängig davon, welcher Wert dieses Klassenattributs enthält.

Wie wäre es, wenn Sie nur ein paar Zeichen wissen, die im Wert eines Attributs enthalten sind? Es ist auch möglich, diese Art von Tags zu erhalten.

In [11]: Antwort.xPath ('/html // div [enthält (@id, "ion")]')).Extrakt()

Der obige Code würde alle DIV -Tags unter dem HTML -Tag mit dem ID -Attribut zurückgeben. Wir wissen jedoch nicht, welchen Wert das Attribut hat, außer dass wir wissen, dass er "Ion" enthält.

Die Seite, die wir analysieren.

Cool rechts?

Tags nach ihrem Text

Denken Sie daran. Wir können auch Tags mit ihrem Text übereinstimmen.

In [12]: Antwort.xPath ('/html // a [.= "Algerien"] ')).Extrakt()

Der obige Code würde uns helfen, alle Anker -Tags zu erhalten, die den Text „Algerien“ enthält. NB: Es muss Tags mit genau diesem Textinhalt sein.

Wunderbar.

Wie wäre es, wenn wir im genauen Textinhalt nicht wissen und nur einige des Textinhalts kennen? Das können wir auch tun.

In [13]: Antwort.xPath ('/html // a [enthält (text (), "a")']).Extrakt()

Der obige Code würde die Tags mit dem Buchstaben „A“ in ihren Textinhalt einbeziehen.

Extrahieren von Tag -Inhalten

Die ganze Zeit haben wir darüber gesprochen, die richtigen Tags zu finden. Es ist Zeit, den Inhalt des Tags zu extrahieren, wenn wir es finden.

Es ist ziemlich einfach. Wir müssen lediglich der Syntax „/text ()“ hinzufügen, und der Inhalt des Tags würde extrahiert.

In [14]: Antwort.xPath ('/html // a/text ()').Extrakt()

Der obige Code würde alle Anker -Tags im HTML -Dokument erhalten und dann den Textinhalt extrahieren.

Extrahieren der Links

Nachdem wir nun wissen, wie man den Text in Tags extrahiert, sollten wir wissen, wie wir die Werte von Attributen extrahieren können. In den meisten Fällen sind die Werte von Attributen, die für uns von größter Bedeutung sind.

Dies ist fast das gleiche wie das Extrahieren der Textwerte, aber anstatt "/text ()" zu verwenden, würden wir das Symbol "/@" und den Namen des Attributs verwenden.

In [15]: Antwort.XPATH ('/html // a/@href').Extrakt()

Der obige Code würde alle Links in den Anker -Tags extrahieren, die Links sollen die Werte des href Attribut.

Navigierende Geschwister -Tags

Wenn Sie es bemerkt haben, haben wir uns die ganze Zeit über Tags navigiert. Es gibt jedoch eine Situation, die wir nicht angepackt haben.

Wie wählen wir ein bestimmtes Tag aus, wenn Tags mit demselben Namen auf derselben Ebene liegen?




Afghanistan




Alandinseln


In einem Fall wie dem oben, den wir oben haben, könnten wir sagen, dass wir verwenden würden extract_first () das erste Match bekommen.

Was ist jedoch, wenn wir mit dem zweiten zusammenkommen wollen?? Was ist, wenn es mehr als zehn Optionen gibt und wir den fünften wollen? Wir werden das gerade beantworten.

Hier ist die Lösung: Wenn wir unsere XPath -Syntax schreiben, setzen wir die Position des von uns gewünschten Tags in quadratischen Klammern ein, genau wie wir indizieren, aber der Index beginnt bei 1.

Wenn Sie sich die HTML der Webseite ansehen, mit der wir es zu tun haben, würden Sie feststellen, dass es viel gibt Tags auf derselben Ebene. Um den dritten zu bekommen Tag, wir würden den folgenden Code verwenden:

In [16]: Antwort.XPath ('/html // tr [3]').Extrakt()

Sie würden auch bemerken, dass die Tags sind in zwei, wenn wir nur die zweite wollen Tags aus dem Zeilen wir würden Folgendes machen:

In [17]: Antwort.xPath ('/html // td [2]').Extrakt()

ABSCHLUSS:

XPATH ist eine sehr leistungsstarke Möglichkeit, HTML -Dateien zu analysieren, und könnte dazu beitragen, die Verwendung regulärer Ausdrücke bei der Analyse zu minimieren, wenn man bedenkt, dass sie das hat enthält Funktion in seiner Syntax.

Es gibt andere Bibliotheken, die das Parsen mit XPath wie Selen für Webautomation ermöglichen. XPath gibt uns viele Optionen beim Parsen von HTML, aber was in diesem Artikel behandelt wurde.