SchöneSuppe

So analysieren Sie XML-Dateien mit Pythons BeautifulSoup

So analysieren Sie XML-Dateien mit Pythons BeautifulSoup
Daten sind buchstäblich überall, in allen Arten von Dokumenten. Aber nicht alles ist nützlich, daher muss es analysiert werden, um die benötigten Teile zu erhalten. XML-Dokumente sind eines dieser Dokumente, die Daten enthalten. Sie sind HTML-Dateien sehr ähnlich, da sie fast die gleiche Struktur haben. Daher müssen Sie sie parsen, um wichtige Informationen zu erhalten, genau wie bei der Arbeit mit HTML.

Es gibt zwei Hauptaspekte beim Parsen von XML-Dateien. Sie sind:

Sie müssen das Tag finden, das die gewünschten Informationen enthält, und diese Informationen dann extrahieren. Vor dem Ende dieses Artikels erfahren Sie, wie Sie beides beim Arbeiten mit XML-Dateien tun können.

Installation

BeautifulSoup ist eine der am häufigsten verwendeten Bibliotheken, wenn es um Web-Scraping mit Python geht. Da XML-Dateien HTML-Dateien ähneln, ist es auch in der Lage, diese zu parsen. Um XML-Dateien mit BeautifulSoup zu analysieren, verwenden Sie am besten Pythons lxml Parser.

Sie können beide Bibliotheken mit dem installieren Pip Installationstool, über den folgenden Befehl:

pip install bs4 lxml

Um zu bestätigen, dass beide Bibliotheken erfolgreich installiert wurden, können Sie die interaktive Shell aktivieren und versuchen, beide zu importieren. Wenn kein Fehler angezeigt wird, können Sie mit dem Rest des Artikels fortfahren.

Hier ist ein Beispiel:

$python
Python 3.7.4 (tags/v3.7.4:e09359112e, 8. Juli 2019, 20:34:20)
[MSC v.1916 64 Bit (AMD64)] auf win32
Geben Sie "Hilfe", "Copyright", "Credits" oder "Lizenz" ein, um weitere Informationen zu erhalten.
>>> bs4 importieren
>>> lxml importieren
>>>

Bevor Sie fortfahren, sollten Sie eine XML-Datei aus dem folgenden Code-Snippet erstellen. Es ist ganz einfach und sollte zu den Anwendungsfällen passen, die Sie im Rest des Artikels kennenlernen werden. Einfach kopieren, in Ihren Editor einfügen und speichern; ein Name wie Stichprobe.xml sollte reichen.



Der Baum

Zuerst
Zweite

Dritte

Einer
Zwei
Zwillinge


Vierte

Jetzt in Ihrem Python-Skript; Sie müssen die XML-Datei wie eine normale Datei lesen und dann an BeautifulSoup übergeben. Der Rest dieses Artikels verwendet die bs_content variabel, daher ist es wichtig, dass Sie diesen Schritt machen.

# SchöneSoup importieren
von bs4 importieren BeautifulSoup als bs
Inhalt = []
# XML-Datei lesen
mit open("Beispiel.xml", "r") als Datei:
# Lies jede Zeile in der Datei, readlines() gibt eine Liste von Zeilen zurück
Inhalt = Datei.Lesezeilen()
# Kombinieren Sie die Zeilen in der Liste zu einem String
Inhalt = "".beitreten (Inhalt)
bs_content = bs(Inhalt, "lxml")

Das obige Codebeispiel importiert SchöneSuppe, dann liest es die XML-Datei wie eine normale Datei. Danach übergibt es den Inhalt an das importierte SchöneSuppe Bibliothek sowie der Parser der Wahl.

Sie werden feststellen, dass der Code nicht importiert wird lxml. Es muss nicht so sein SchöneSuppe werde die wählen lxml Parser als Ergebnis des Passierens "lxml" in das Objekt.

Jetzt können Sie mit dem Rest des Artikels fortfahren.

Tags suchen

Einer der wichtigsten Schritte beim Parsen von XML-Dateien ist die Suche nach Tags. Es gibt verschiedene Möglichkeiten, dies bei der Verwendung von BeautifulSoup zu tun; Sie müssen also eine Handvoll davon kennen, um die besten Werkzeuge für die entsprechende Situation zu haben.

Sie können Tags in XML-Dokumenten finden, indem Sie:

Tags nach Namen suchen

Es gibt zwei BeautifulSoup-Methoden, die Sie verwenden können, um Tags nach Namen zu finden. Die Anwendungsfälle unterscheiden sich jedoch; werfen wir einen Blick auf sie.

finden

Aus eigener Erfahrung verwenden Sie die finden Methode häufiger als die anderen Methoden zum Suchen von Tags in diesem Artikel. Das find-Tag empfängt den Namen des Tags, das Sie abrufen möchten, und gibt ein BeautifulSoup-Objekt des Tags zurück, wenn es eines findet. sonst kehrt es zurück Keiner.

Hier ist ein Beispiel:

>>> Ergebnis = bs_content.find("Daten")
>>> drucken (Ergebnis)
Einer
>>> Ergebnis = bs_content.find("einzigartig")
>>> drucken (Ergebnis)
Zwillinge
>>> Ergebnis = bs_content.find("Vater")
>>> drucken (Ergebnis)
Keiner
>>> Ergebnis = bs_content.find("Mutter")
>>> drucken (Ergebnis)
Keiner

Wenn Sie sich das Beispiel ansehen, sehen Sie, dass die finden Methode gibt ein Tag zurück, wenn es mit dem Namen übereinstimmt, andernfalls gibt es None zurück. Wenn Sie es sich jedoch genauer ansehen, werden Sie feststellen, dass nur ein einziges Tag zurückgegeben wird.

Zum Beispiel, wenn find("Daten") aufgerufen wurde, hat es nur das erste Daten-Tag zurückgegeben, die anderen jedoch nicht.

ERWISCHT: Das finden Methode gibt nur das erste Tag zurück, das seiner Abfrage entspricht.

Wie findet man also auch andere Tags?? Das führt uns zur nächsten Methode.

finde alle

Das finde alle Methode ist der sehr ähnlich finden Methode. Der einzige Unterschied besteht darin, dass es eine Liste von Tags zurückgibt, die seiner Abfrage entsprechen. Wenn es kein Tag findet, gibt es einfach eine leere Liste zurück. Daher, finde alle wird immer eine Liste zurückgeben.

Hier ist ein Beispiel:

>>> Ergebnis = bs_content.find_all("Daten")
>>> drucken (Ergebnis)
[Einer, Zwei]
>>> Ergebnis = bs_content.find_all("Kind")
>>> drucken (Ergebnis)
[Zuerst, Zweite,
Dritte

Einer
Zwei
Zwillinge

, Vierte]
>>> Ergebnis = bs_content.find_all("Vater")
>>> drucken (Ergebnis
[]
>>> Ergebnis = bs_content.find_all("Mutter")
>>> drucken (Ergebnis)
[]

Jetzt wissen Sie, wie Sie die finden und finde alle -Methoden können Sie überall im XML-Dokument nach Tags suchen. Sie können Ihre Suche jedoch leistungsstärker gestalten.

Hier ist wie:

Einige Tags haben möglicherweise denselben Namen, aber unterschiedliche Attribute. Zum Beispiel die Kind Tags haben ein Name Attribut und verschiedene Werte. Auf dieser Grundlage können Sie gezielt suchen make.

Guck dir das an:

>>> Ergebnis = bs_content.find("kind", "name": "Rose")
>>> drucken (Ergebnis)
Zweite
>>> Ergebnis = bs_content.find_all("kind", "name": "Rose")
>>> drucken (Ergebnis)
[Zweite]
>>> Ergebnis = bs_content.find("kind", "name": "Jack")
>>> drucken (Ergebnis)
Zuerst
>>> Ergebnis = bs_content.find_all("kind", "name": "Jack")
>>> drucken (Ergebnis)
[Zuerst]

Sie werden sehen, dass die Verwendung der etwas anders ist finden und finde alle Methoden hier: beide haben einen zweiten Parameter.

Wenn Sie ein Wörterbuch als zweiten Parameter übergeben, wird die finden und finde alle Methoden ihre Suche weiter, um Tags mit Attributen und Werten zu erhalten, die dem bereitgestellten Schlüssel:Wert-Paar entsprechen.

Trotz der Verwendung des finden Methode im ersten Beispiel hat sie das zweite zurückgegeben Kind tag (anstelle des ersten Kind Tag), da dies das erste Tag ist, das der Abfrage entspricht. Das finde alle tag folgt dem gleichen Prinzip, gibt jedoch alle Tags zurück, die der Abfrage entsprechen, nicht nur das erste.

Suchen von Tags nach Beziehungen

Während die Suche nach Tag-Namen weniger beliebt ist, können Sie auch nach Beziehungen nach Tags suchen. Im eigentlichen Sinne ist es jedoch mehr Navigieren als Suchen.

Es gibt drei wichtige Beziehungen in XML-Dokumenten:

Aus der obigen Erläuterung können Sie ableiten, dass das Referenz-Tag der wichtigste Faktor bei der Suche nach Tags nach Beziehungen ist. Suchen wir also nach dem Referenz-Tag und fahren Sie mit dem Artikel fort.

Schau dir das an:

>>> drittes_kind = bs_content.find("kind", "name": "Blue Ivy")
>>> drucken(drittes_kind)

Dritte

Einer
Zwei
Zwillinge

Aus dem obigen Codebeispiel ist das Referenz-Tag für den Rest dieses Abschnitts das dritte Kind Tag, gespeichert in a drittes_kind Variable. In den folgenden Unterabschnitten erfahren Sie, wie Sie nach Tags suchen, die auf der Beziehung zwischen Eltern, Geschwistern und Kindern mit dem Referenz-Tag basieren.

Eltern finden

Um das übergeordnete Tag eines Referenz-Tags zu finden, verwenden Sie das Elternteil Attribut. Dadurch wird das übergeordnete Tag sowie die darunter liegenden Tags zurückgegeben. Dieses Verhalten ist durchaus verständlich, da die Child-Tags Teil des Parent-Tags sind.

Hier ist ein Beispiel:

>>> Ergebnis = drittes_Kind.Elternteil
>>> drucken (Ergebnis)

Zuerst
Zweite

Dritte

Einer
Zwei
Zwillinge


Vierte

Kinder finden

Um die untergeordneten Tags eines Referenz-Tags zu finden, verwenden Sie die Kinder Attribut. Dadurch werden die untergeordneten Tags sowie die untergeordneten Tags unter jedem von ihnen zurückgegeben. Dieses Verhalten ist auch verständlich, da die Kinder-Tags oft auch eigene Kinder-Tags haben.

Eine Sache, die Sie beachten sollten, ist, dass die Kinder Attribut gibt die Kinder-Tags als Generator zurück. Wenn Sie also eine Liste der Kinder-Tags benötigen, müssen Sie den Generator in eine Liste umwandeln.

Hier ist ein Beispiel:

>>> Ergebnis = Liste(drittes_Kind.Kinder)
>>> drucken (Ergebnis)
['\n        Dritte\n     ',
Einer
Zwei
Zwillinge
, '\n']

Wenn Sie sich das obige Beispiel genauer ansehen, werden Sie feststellen, dass einige Werte in der Liste keine Tags sind. Darauf musst du achten.

ERWISCHT: Das Kinder -Attribut gibt nicht nur die Kinder-Tags zurück, sondern auch den Text im Referenz-Tag.

Geschwister finden

Als letztes in diesem Abschnitt finden Sie Tags, die Geschwister des Referenz-Tags sind. Für jedes Referenz-Tag kann es davor und danach Geschwister-Tags geben. Das vorherige_Geschwister -Attribut gibt die Geschwister-Tags vor dem Referenz-Tag zurück, und die nächste_geschwister -Attribut gibt die Geschwister-Tags danach zurück.

Genau wie die Kinder Attribut, das vorherige_Geschwister und nächste_geschwister Attribute geben Generatoren zurück. Sie müssen also in eine Liste konvertieren, wenn Sie eine Liste von Geschwistern benötigen.

Schau dir das an:

>>> vorherige_Geschwister = Liste(drittes_Kind.vorherige_Geschwister)
>>> drucken(vorherige_Geschwister)
['\n', Zweite, '\n',
Zuerst, '\n']
>>> next_siblings = list(drittes_kind.nächste_Geschwister)
>>> drucken(nächste_Geschwister)
['\n', Vierte]
>>> drucken(vorherige_Geschwister + nächste_Geschwister)
['\n', Zweite, '\n', Zuerst,
'\n', '\n', Vierte, '\n']

Das erste Beispiel zeigt die vorherigen Geschwister, das zweite die nächsten Geschwister; dann werden beide Ergebnisse kombiniert, um eine Liste aller Geschwister für das Referenz-Tag zu erstellen.

Aus Tags extrahieren

Beim Parsen von XML-Dokumenten liegt ein Großteil der Arbeit darin, die richtigen Tags zu finden. Wenn Sie sie jedoch finden, möchten Sie möglicherweise auch bestimmte Informationen aus diesen Tags extrahieren, und das wird Ihnen dieser Abschnitt beibringen.

Sie werden sehen, wie Sie Folgendes extrahieren:

Extrahieren von Tag-Attributwerten

Manchmal haben Sie möglicherweise einen Grund, die Werte für Attribute in einem Tag zu extrahieren. In der folgenden Attribut-Wert-Paarung zum Beispiel: name=”Rose”, Vielleicht möchten Sie „Rose“ extrahieren.”

Dazu können Sie die erhalten -Methode oder den Zugriff auf den Namen des Attributs mit [] wie ein Index, genau wie bei der Arbeit mit einem Wörterbuch.

Hier ist ein Beispiel:

>>> Ergebnis = drittes_Kind.get("Name")
>>> drucken (Ergebnis)
Blauer Efeu
>>> Ergebnis = drittes_Kind["Name"]
>>> drucken (Ergebnis)
Blauer Efeu

Tag-Text extrahieren

Wenn Sie auf die Textwerte eines Tags zugreifen möchten, können Sie das Text oder Saiten Attribut. Beide geben den Text in einem Tag zurück und sogar die untergeordneten Tags. Allerdings ist die Text Das Attribut gibt sie als einzelnen String zurück, verkettet; während Saiten -Attribut gibt sie als Generator zurück, den Sie in eine Liste umwandeln können.

Hier ist ein Beispiel:

>>> Ergebnis = drittes_Kind.Text
>>> drucken (Ergebnis)
'\n    Dritte\n      \nEin\nZwei\nZwillinge\n\n'
>>> Ergebnis = Liste(drittes_Kind.Saiten)
>>> drucken (Ergebnis)
['\n  Dritte\n      ', '\n', 'Eins', '\n', 'Zwei', '\n', 'Zwillinge', '\n', '\n']

Tag-Inhalte extrahieren

Neben dem Extrahieren der Attributwerte und des Tag-Textes können Sie auch den gesamten Inhalt eines Tags extrahieren. Dazu können Sie die Inhalt Attribut; es ist ein bisschen ähnlich wie die Kinder Attribut und führt zu den gleichen Ergebnissen. Doch während die Kinder Attribut gibt einen Generator zurück, der Inhalt Attribut gibt eine Liste zurück.

Hier ist ein Beispiel:

>>> Ergebnis = drittes_Kind.Inhalt
>>> drucken (Ergebnis)
['\n        Dritte\n     ',
Einer
Zwei
Zwillinge
, '\n']

Schön drucken

Bisher haben Sie einige wichtige Methoden und Attribute gesehen, die beim Parsen von XML-Dokumenten mit BeautifulSoup nützlich sindSo. Wenn Sie jedoch feststellen, dass die Tags beim Drucken auf dem Bildschirm eine Art Cluster-Aussehen haben. Auch wenn das Aussehen keinen direkten Einfluss auf Ihre Produktivität hat, kann es Ihnen helfen, effektiver zu analysieren und die Arbeit weniger mühsam zu machen.

Hier ist ein Beispiel für das normale Drucken:

>>> drucken(drittes_kind)

Dritte

Einer
Zwei
Zwillinge

Sie können das Erscheinungsbild jedoch verbessern, indem Sie die verschönern Methode. Rufen Sie einfach an verschönern Methode auf dem Etikett beim Drucken, und Sie erhalten etwas optisch ansprechendes.

Schau dir das an:

Fazit

Das Parsen von Dokumenten ist ein wichtiger Aspekt bei der Datenbeschaffung. XML-Dokumente sind ziemlich beliebt, und hoffentlich sind Sie besser gerüstet, um sie zu übernehmen und die gewünschten Daten zu extrahieren.

Mit diesem Artikel können Sie jetzt:

Wenn Sie sich ziemlich verloren fühlen und noch ziemlich neu in der BeautifulSoup-Bibliothek sind, können Sie sich das BeautifulSoup-Tutorial für Anfänger ansehen.

So zeigen Sie den FPS-Zähler in Linux-Spielen an
Linux-Gaming bekam einen großen Schub, als Valve 2012 die Linux-Unterstützung für den Steam-Client und seine Spiele ankündigte. Seitdem haben viele AA...
Herunterladen und Spielen von Sid Meier's Civilization VI unter Linux and
Einführung in das Spiel Civilization 6 ist eine moderne Version des klassischen Konzepts, das in der Reihe der Age of Empires-Spiele eingeführt wurde....
So installieren und spielen Sie Doom unter Linux
Einführung in Doom Die Doom-Serie entstand in den 90er Jahren nach der Veröffentlichung des ursprünglichen Doom. Es war sofort ein Hit und seitdem hat...