So analysieren Sie XML -Dateien mit Python's BeautifulSoup

So analysieren Sie XML -Dateien mit Python's BeautifulSoup

Daten sind buchstäblich überall in allen möglichen 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 Art von Struktur haben. Daher müssen Sie sie analysieren, um wichtige Informationen zu erhalten, so wie Sie es bei der Arbeit mit HTML tun würden.Das Parsen von XML -Dateien hat zwei Hauptaspekte. Sie sind:

  • Tags finden
  • Extrahieren aus Tags

Sie müssen das Tag finden, das die gewünschten Informationen enthält, und dann diese Informationen extrahieren. Sie lernen, wie man beides macht, wenn Sie vor dem Ende dieses Artikels mit XML -Dateien arbeiten.

Installation

BeautifulSoup ist eine der am häufigsten verwendeten Bibliotheken, wenn es um das Web -Scraping mit Python geht. Da XML -Dateien HTML -Dateien ähnlich sind, kann sie sie auch analysieren. Um XML -Dateien mit BeautifulSoup zu analysieren, verwenden Sie Python's am besten lxml Parser.

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

PIP Installieren Sie BS4 LXML

Um zu bestätigen, dass beide Bibliotheken erfolgreich installiert sind, können Sie die interaktive Shell aktivieren und versuchen, beide zu importieren. Wenn kein Fehler auftaucht, sind Sie bereit, mit dem Rest des Artikels zu gehen.

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" für weitere Informationen ein.
>>> BS4 importieren
>>> LXML importieren
>>>

Bevor Sie fortfahren. Es ist recht einfach und sollte den Anwendungsfällen entsprechen, über die Sie im Rest des Artikels erfahren werden. Einfach kopieren, in Ihren Editor einfügen und speichern. ein Name wie Probe.xml sollte ausreichen.



Der Baum

Erste
Zweite

Dritte

Eins
Zwei
Zwillinge


Vierte

Jetzt in Ihrem Python -Skript; Sie müssen die XML -Datei wie eine normale Datei lesen und dann in BeautifulSoup übergeben. Der Rest dieses Artikels wird das nutzen BS_Content Variable, daher ist es wichtig, dass Sie diesen Schritt tun.

# BeautifulSoup importieren
von BS4 importieren Sie BeautifulSoup als BS
Inhalt = []
# Lesen Sie die XML -Datei
mit offen ("Probe.xml "," r ") als Datei:
# Lesen Sie jede Zeile in der Datei, Readlines () gibt eine Liste von Zeilen zurück
content = Datei.Readlines ()
# Kombinieren Sie die Zeilen in der Liste in eine Zeichenfolge
content = "".beitreten (Inhalt)
BS_CONTENT = BS (Inhalt, "LXML")

Die obige Codeprobe oben Importe Schöne Gruppe, Dann liest es die XML -Datei wie eine reguläre Datei. Danach übergibt es den Inhalt in den Importierten Schöne Gruppe Bibliothek sowie der Parser der Wahl.

Sie werden feststellen, dass der Code nicht importiert wird lxml. Es muss nicht so Schöne Gruppe wird die auswählen lxml Parser als Ergebnis des Vorgehens "LXML" in das Objekt.

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

Tags finden

Eine der wichtigsten Phasen der 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 etwas über eine Handvoll von ihnen wissen, um die besten Werkzeuge für die entsprechende Situation zu haben.

Sie finden Tags in XML -Dokumenten nach:

  • Namen
  • Beziehungen

Tags mit Namen finden

Es gibt zwei schöne Methoden, die Sie verwenden können, wenn Sie Tags mit Namen finden. Die Anwendungsfälle unterscheiden sich jedoch; Schauen wir sie uns an.

finden

Aus persönlicher Erfahrung werden Sie die verwenden finden Methode öfter als die anderen Methoden zum Auffinden von Tags in diesem Artikel. Das Find -Tag empfängt den Namen des Tags, den Sie erhalten möchten, und gibt ein wunderschönes Objekt des Tags zurück, wenn es einen findet. sonst kehrt es zurück Keiner.

Hier ist ein Beispiel:

>>> result = bs_content.find ("Daten")
>>> drucken (Ergebnis)
Eins
>>> result = bs_content.Find ("einzigartig")
>>> drucken (Ergebnis)
Zwillinge
>>> result = bs_content.finde ("Vater")
>>> drucken (Ergebnis)
Keiner
>>> result = bs_content.finde ("Mutter")
>>> drucken (Ergebnis)
Keiner

Wenn Sie sich das Beispiel ansehen, sehen Sie das die finden Die Methode gibt ein Tag zurück, wenn es mit dem Namen übereinstimmt, sonst gibt es keine zurück. Wenn Sie es sich jedoch genauer ansehen, werden Sie feststellen, dass es nur ein einzelnes Tag zurückgibt.

Zum Beispiel wenn Finden ("Daten") wurde genannt, es gab nur das erste Daten -Tag zurück, aber die anderen nicht zurückgegeben.

ERWISCHT: Der finden Die Methode gibt nur das erste Tag zurück, das der Abfrage entspricht.

Wie können Sie also auch andere Tags finden?? Das führt uns zur nächsten Methode.

finde alle

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

Hier ist ein Beispiel:

>>> result = bs_content.find_all ("Daten")
>>> drucken (Ergebnis)
[Eins, Zwei]
>>> result = bs_content.find_all ("Kind")
>>> drucken (Ergebnis)
[Erste, Zweite,
Dritte

Eins
Zwei
Zwillinge

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

Jetzt, wo Sie wissen, wie man das benutzt finden Und finde alle Methoden können Sie überall im XML -Dokument nach Tags suchen. Sie können Ihre Suche jedoch leistungsfähiger machen.

Hier ist wie:

Einige Tags haben möglicherweise denselben Namen, aber unterschiedliche Attribute. Zum Beispiel die Kind Tags haben a Name Attribut und verschiedene Werte. Sie können spezifische Suchanfragen basierend auf diesen durchführen.

Guck dir das an:

>>> result = bs_content.Find ("Kind", "Name": "Rose")
>>> drucken (Ergebnis)
Zweite
>>> result = bs_content.find_all ("Kind", "Name": "Rose")
>>> drucken (Ergebnis)
[Zweite]
>>> result = bs_content.Find ("Child", "Name": "Jack")
>>> drucken (Ergebnis)
Erste
>>> result = bs_content.find_all ("Kind", "Name": "Jack")
>>> drucken (Ergebnis)
[Erste]

Sie werden sehen, dass die Verwendung der Verwendung etwas anderes hat finden Und finde alle Methoden hier: Beide haben einen zweiten Parameter.

Wenn Sie ein Wörterbuch als zweiter Parameter eingeben, ist die finden Und finde alle Methoden fördern ihre Suche, um Tags zu erhalten, die Attribute und Werte haben, die dem bereitgestellten Schlüssel: Wertpaar entsprechen.

Zum Beispiel trotz der Verwendung der finden Methode Im ersten Beispiel gab es das zweite zurück Kind Tag (statt der ersten Kind Tag), weil dies das erste Tag ist, das der Abfrage entspricht. Der finde alle Tag folgt dem gleichen Prinzip, außer dass es alle Tags zurückgibt, die der Abfrage entsprechen, nicht nur dem ersten.

Finden von Tags nach Beziehungen finden

Obwohl Sie weniger beliebt sind als nach Tagennamen zu suchen, können Sie auch nach Tags nach Beziehungen suchen. Im wirklichen Sinne ist es jedoch eher navigierend als die Suche.

Es gibt drei wichtige Beziehungen in XML -Dokumenten:

  • Elternteil: Das Tag, in dem das Referenz -Tag existiert.
  • Kinder: Die Tags, die im Referenz -Tag existieren.
  • Geschwister: Die Tags, die auf der gleichen Ebene wie das Referenz -Tag existieren.

Aus der obigen Erklärung können Sie schließen, dass das Referenz -Tag der wichtigste Faktor für die Suche nach Tags nach Beziehungen ist. Schauen wir uns daher nach dem Referenz -Tag und setzen Sie den Artikel fort.

Schau dir das an:

>>> Third_child = BS_Content.Find ("Child", "Name": "Blue Ivy")
>>> drucken (dritter_child)

Dritte

Eins
Zwei
Zwillinge

Aus dem obigen Code -Beispiel ist das Referenz -Tag für den Rest dieses Abschnitts das dritte Kind Tag, gespeichert in a dritter_child Variable. In den folgenden Unterabschnitten werden Sie sehen.

Eltern finden

Um das übergeordnete Tag eines Referenz -Tags zu finden, verwenden Sie die Elternteil Attribut. Dies gibt das übergeordnete Tag sowie die darunter liegenden Tags zurück. Dieses Verhalten ist verständlich, da die Kinder -Tags Teil des übergeordneten Tags sind.

Hier ist ein Beispiel:

>>> result = Third_child.Elternteil
>>> drucken (Ergebnis)

Erste
Zweite

Dritte

Eins
Zwei
Zwillinge


Vierte

Kinder finden

Um die Kinder -Tags eines Referenz -Tags zu finden, verwenden Sie die Kinder Attribut. Dies gibt die Kinder-Tags sowie die Untertags unter jedem von ihnen zurück. Dieses Verhalten ist auch verständlich, da die Kinder -Tags oft auch ihre eigenen 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:

>>> result = list (dritt_child.Kinder)
>>> drucken (Ergebnis)
['\ n drittes \ n',
Eins
Zwei
Zwillinge
, '\N']

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

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

Geschwister finden

Der letzte in diesem Abschnitt ist das Finden von Tags, die Geschwister für das Referenz -Tag sind. Für jedes Referenz -Tag kann es vor und danach Geschwister -Tags geben. Der vorherige_Siblings Das Attribut gibt die Geschwister -Tags vor dem Referenz -Tag und die zurück NEXT_Siblings Das Attribut gibt die Geschwister -Tags danach zurück.

Genau wie das Kinder Attribut, die vorherige_Siblings Und NEXT_Siblings 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:

>>> PROBOR_SIBLINGS = LIST (Third_Child.vorherige_Siblings)
>>> drucken (vorherige_sillings)
['\N', Zweite, '\N',
Erste, '\N']
>>> Next_sillings = LIST (dritter_child.NEXT_Siblings)
>>> print (next_siblings)
['\N', Vierte]
>>> drucken (vorherige_sillings + next_siblings)
['\N', Zweite, '\N', Erste,
'\ n', '\ n', Vierte, '\N']

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

Extrahieren aus Tags

Bei der 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 man Folgendes extrahiert:

  • Tag -Attributwerte
  • Tag Text
  • Tag -Inhalt

Extrahieren von Tag -Attributwerten extrahieren

Manchmal haben Sie möglicherweise einen Grund, die Werte für Attribute in einem Tag zu extrahieren. In der folgenden Attributwertpaarung zum Beispiel: Name = "Rose", Vielleicht möchten Sie „Rose extrahieren.”

Dazu können Sie das verwenden erhalten Methode oder Zugriff auf den Namen des Attributs verwenden mit [] Wie ein Index, so wie Sie es tun würden, wenn Sie mit einem Wörterbuch arbeiten.

Hier ist ein Beispiel:

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

Extrahieren von Tag Text

Wenn Sie auf die Textwerte eines Tags zugreifen möchten, können Sie die verwenden Text oder Saiten Attribut. Beide werden den Text in einem Tag zurückgeben, und sogar die Kinder -Tags. Allerdings die Text Das Attribut gibt sie als einzelne String zurück, verkettet; während Saiten Das Attribut gibt sie als Generator zurück, den Sie in eine Liste konvertieren können.

Hier ist ein Beispiel:

>>> result = Third_child.Text
>>> drucken (Ergebnis)
'\ n dritters \ n \ none \ ntwo \ ntwins \ n \ n'
>>> result = list (dritt_child.Saiten)
>>> drucken (Ergebnis)
['\ n dritters \ n', '\ n', 'ein', '\ n', 'zwei', '\ n', 'Twins', '\ n', '\ n']

Extrahieren von Tag -Inhalten

Durch das Extrahieren der Attributwerte und des Tagtextes können Sie auch alle Tags -Inhalte extrahieren. Dazu können Sie die verwenden Inhalt Attribut; es ist ein bisschen ähnlich wie das Kinder Attribut und liefert die gleichen Ergebnisse. Aber während die Kinder Attribut gibt einen Generator zurück, das Inhalt Attribut gibt eine Liste zurück.

Hier ist ein Beispiel:

>>> result = Third_child.Inhalt
>>> drucken (Ergebnis)
['\ n drittes \ n',
Eins
Zwei
Zwillinge
, '\N']

Drucken schön

Bisher haben Sie einige wichtige Methoden und Attribute gesehen, die bei der Parsen von XML -Dokumenten mit BeautifulSoup nützlich sind. Wenn Sie jedoch feststellen, dass Sie die Tags auf dem Bildschirm drucken. Während das Aussehen möglicherweise keinen direkten Einfluss auf Ihre Produktivität hat, kann es Ihnen helfen, effektiver zu analysieren und die Arbeit weniger langweilig zu machen.

Hier ist ein Beispiel, um die normale Weise zu drucken:

>>> drucken (dritter_child)

Dritte

Eins
Zwei
Zwillinge

Sie können jedoch das Aussehen verbessern, indem Sie die verwenden hübsch Methode. Rufen Sie einfach die an hübsch Methode auf dem Tag während des Druckens, und Sie erhalten etwas visuell erfreuliches.

Schau dir das an:

Abschluss

Das Parsinieren von Dokumenten ist ein wichtiger Aspekt der Beschaffung von Daten. XML.

Aus diesem Artikel können Sie jetzt:

  • Suchen Sie nach Tags entweder mit Namen oder Beziehungen
  • Daten aus Tags extrahieren

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