kratzig

Scrapy mit XPath-Selektoren

Scrapy mit XPath-Selektoren
HTML ist die Sprache der Webseiten, und zwischen dem Öffnen und Schließen jeder Webseite hängen viele Informationen html Etikett. Es gibt viele Möglichkeiten, darauf zuzugreifen, aber in diesem Artikel würden wir dies mit dem XPath-Selektor über die Scrapy-Bibliothek von Python tun.

Die Scrapy-Bibliothek ist eine sehr leistungsstarke Web-Scraping-Bibliothek, die auch einfach zu verwenden ist. Wenn Sie noch nicht damit vertraut sind, können Sie das verfügbare Tutorial zur Verwendung der Scrapy-Bibliothek befolgen.

Dieses Tutorial behandelt die Verwendung von XPath-Selektoren. XPath verwendet eine pfadähnliche Syntax, um durch die Knoten von XML-Dokumenten zu navigieren. Sie sind auch nützlich beim Navigieren in HTML-Tags.

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

Wir werden mit dem Beispiel arbeiten.Webscraping.com-Site, da sie sehr einfach ist und helfen würde, die Konzepte zu verstehen.

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

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

Es würde die Site besuchen und die erforderlichen Informationen abrufen und uns dann eine interaktive Shell zum Arbeiten überlassen. Sie sollten eine Eingabeaufforderung sehen wie:

In 1]:

Ab der interaktiven Sitzung werden wir mit den Antwort Objekt.

So würde unsere Syntax für den Groß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 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 in einer Liste zu speichern.
Wir können jetzt mit der Arbeit an der XPath-Syntax beginnen.

NAVIGIERENDE TAGS

Das Navigieren in Tags in XPath ist sehr einfach, alles, was Sie brauchen, ist der Schrägstrich „/“ gefolgt vom Namen des Tags.

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

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

Wenn wir den Hauptteil der Webseite abrufen möchten, würden wir Folgendes verwenden:

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

XPath erlaubt auch das Platzhalterzeichen „*“, das zu allem in der Ebene passt, in der es verwendet wird.

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

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

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

Abgesehen von der Navigation in Tags können wir alle Nachkommen-Tags eines bestimmten Tags abrufen, indem wir das „//“ verwenden.

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

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

TAGS NACH ATTRIBUTE UND IHRE WERTE

Manchmal kann es schwierig sein, durch HTML-Tags zum erforderlichen Tag zu navigieren. Dieses Problem kann abgewendet werden, indem einfach das benötigte Tag anhand seines Attributs 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 Ich würde Attribut mit einem Wert von Seitennummerierung.

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

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

Was ist, wenn Sie den Wert des Attributs nicht kennen?? Und alles, was Sie wollen, ist Tags mit einem bestimmten Attribut zu erhalten, ohne sich um seinen Wert zu kümmern. Auch dies ist einfach, alles was Sie tun müssen, ist 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, welchen Wert dieses Klassenattribut hat.

Wie wäre es, wenn Sie nur wenige Zeichen kennen, 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 zurückgeben, die das id-Attribut haben, aber wir wissen nicht, welchen Wert das Attribut hat, außer dass wir wissen, dass es "ion" enthält.

Die Seite, die wir analysieren, hat nur ein Tag in dieser Kategorie und der Wert ist „pagination“, also würde es zurückgegeben it.

Cool richtig?

TAGS NACH IHREM TEXT

Denken Sie daran, dass wir Tags zuvor anhand ihrer Attribute abgeglichen haben. Wir können Tags auch anhand ihres Textes zuordnen.

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

Der obige Code würde uns helfen, alle Anker-Tags zu erhalten, die den Text „Algerien“ enthalten. Hinweis: Es müssen Tags mit genau diesem Textinhalt sein.

Wunderbar.

Wie wäre es, wenn wir den genauen Textinhalt nicht kennen, und wir nur einige der Textinhalte kennen? Das können wir auch.

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

Der obige Code würde die Tags erhalten, die den Buchstaben „A“ in ihrem Textinhalt haben.

TAG-INHALTE EXTRAHIEREN

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

Es ist ziemlich einfach. Alles, was wir tun müssen, ist „/text()“ zur Syntax hinzuzufügen, und der Inhalt des Tags wird extrahiert.

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

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

EXTRAKTION DER LINKS

Nachdem wir nun wissen, wie man den Text in Tags extrahiert, sollten wir wissen, wie man die Werte von Attributen extrahiert. Meistens sind die Werte von Attributen, die für uns von größter Bedeutung sind, Links.

Dies ist fast dasselbe wie das Extrahieren der Textwerte, jedoch würden wir anstelle von „/text()“ 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 der href Attribut.

NAVIGIEREN VON GESCHWISTER-TAGS

Wenn Sie es bemerkt haben, haben wir die ganze Zeit durch Tags navigiert. Es gibt jedoch eine Situation, die wir nicht angegangen sind.

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




Afghanistan




Aland-Inseln


In einem Fall wie dem, den wir oben haben, könnten wir, wenn wir uns das ansehen, sagen, dass wir verwenden würden Extract_first() um das erste Spiel zu bekommen.

Was aber, wenn wir den zweiten abgleichen wollen?? Was ist, wenn es mehr als zehn Optionen gibt und wir die fünfte wollen?? Das werden wir gleich beantworten.

Hier ist die Lösung: Wenn wir unsere Xpath-Syntax schreiben, setzen wir die Position des gewünschten Tags in eckige Klammern, genau wie beim Indexieren, aber der Index beginnt bei 1.

Wenn Sie sich den HTML-Code der Webseite ansehen, mit der wir es zu tun haben, werden Sie feststellen, dass es viele Tags auf der gleichen Ebene. Um das dritte zu bekommen Tag würden wir den folgenden Code verwenden:

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

Sie würden auch bemerken, dass die Tags sind zu zweit, wenn wir nur das zweite wollen Tags aus dem Zeilen würden wir Folgendes tun:

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

FAZIT:

Xpath ist eine sehr leistungsfähige Methode zum Parsen von HTML-Dateien und könnte dazu beitragen, die Verwendung von regulären Ausdrücken beim Parsen zu minimieren, da es die enthält Funktion in ihrer Syntax.

Es gibt andere Bibliotheken, die das Parsen mit XPath ermöglichen, wie Selenium für die Webautomatisierung. XPath bietet uns viele Optionen beim Parsen von HTML, aber was in diesem Artikel behandelt wurde, sollte Sie durch gängige HTML-Parsing-Operationen führen können.

Battle for Wesnoth-Tutorial
The Battle for Wesnoth ist eines der beliebtesten Open-Source-Strategiespiele, die Sie derzeit spielen können. Dieses Spiel befindet sich nicht nur se...
0 A.D. Lernprogramm
Von den vielen Strategiespielen da draußen, 0 A.D. schafft es, sich trotz Open Source als umfassender Titel und sehr tiefgehendes, taktisches Spiel ab...
Unity3D-Tutorial
Einführung in Unity 3D Unity 3D ist eine leistungsstarke Engine für die Spieleentwicklung. Es ist plattformübergreifend, das heißt, Sie können Spiele ...