Scraping von Webseiten in Python mit schöner Suppe Die Grundlagen

In einem früheren Tutorial habe ich Ihnen gezeigt, wie Sie mit dem Requests-Modul auf Webseiten mit Python zugreifen. Das Tutorial behandelte viele Themen, wie das Erstellen von GET / POST-Anfragen und das programmgesteuerte Herunterladen von Bildern wie PDFs. Das einzige, was in diesem Tutorial fehlt, war ein Leitfaden zum Scraping von Webseiten, auf die Sie mit Requests zugegriffen haben, um die benötigten Informationen zu extrahieren.

In diesem Lernprogramm erfahren Sie etwas über Beautiful Soup, eine Python-Bibliothek zum Extrahieren von Daten aus HTML-Dateien. Der Schwerpunkt dieses Tutorials liegt auf dem Erlernen der Grundlagen der Bibliothek. Weiterführende Themen werden im nächsten Tutorial behandelt. Bitte beachten Sie, dass dieses Tutorial für alle Beispiele Beautiful Soup 4 verwendet.

Installation

Sie können Beautiful Soup 4 mit installieren Pip. Der Paketname lautet beautifulsoup4. Es sollte auf Python 2 und Python 3 funktionieren.

$ pip installiere beautifulsoup4

Wenn Sie kein Pip auf Ihrem System installiert haben, können Sie das Quell-Archiv von Beautiful Soup 4 direkt herunterladen und es mithilfe von installieren setup.py.

$ python setup.py installieren

BeautifulSoup wurde ursprünglich als Python 2-Code verpackt. Wenn Sie es zur Verwendung mit Python 3 installieren, wird es automatisch auf Python 3-Code aktualisiert. Der Code wird erst konvertiert, wenn Sie das Paket installieren. Hier einige häufige Fehler, die Sie möglicherweise bemerken:

  • Das "Kein Modul mit dem Namen HTMLParser" ImportError tritt auf, wenn Sie die Python 2-Version des Codes unter Python 3 ausführen.
  • Das "Kein Modul mit dem Namen html.parser" ImportError tritt auf, wenn Sie die Python 3-Version des Codes unter Python 2 ausführen.

Beide oben genannten Fehler können durch Deinstallieren und erneutes Installieren von Beautiful Soup behoben werden.

Einen Parser installieren

Bevor wir die Unterschiede zwischen verschiedenen Parsern diskutieren, die Sie mit Beautiful Soup verwenden können, schreiben wir den Code, um eine Suppe zu erstellen.

von bs4 import BeautifulSoup soup = BeautifulSoup ("

Das ist ungültiges HTML

"," html.parser ")

Das BeautifulSoup Objekt kann zwei Argumente akzeptieren. Das erste Argument ist das eigentliche Markup und das zweite Argument ist der Parser, den Sie verwenden möchten. Die verschiedenen Parser sind: html.parser, lxml und html5lib. Das lxml Parser hat zwei Versionen, einen HTML-Parser und einen XML-Parser.

Das html.parser ist ein integrierter Parser, der in älteren Python-Versionen nicht so gut funktioniert. Sie können die anderen Parser mit den folgenden Befehlen installieren:

$ pip install lxml $ pip install html5lib

Das lxml Parser ist sehr schnell und kann verwendet werden, um gegebenes HTML schnell zu analysieren. Auf der anderen Seite die html5lib Parser ist sehr langsam, aber auch sehr nachsichtig. Hier ist ein Beispiel für die Verwendung jedes dieser Parser:

Suppe = BeautifulSoup ("

Das ist ungültiges HTML

"," html.parser ") print (suppe) #

Das ist ungültiges HTML

Suppe = BeautifulSoup ("

Das ist ungültiges HTML

"," lxml ") Druck (Suppe) #

Das ist ungültiges HTML

Suppe = BeautifulSoup ("

Das ist ungültiges HTML

"," xml ") Druck (Suppe) # #

Das ist ungültiges HTML

Suppe = BeautifulSoup ("

Das ist ungültiges HTML

"," html5lib ") drucken (Suppe) #

Das ist ungültiges HTML

Die im obigen Beispiel beschriebenen Unterschiede sind nur von Bedeutung, wenn Sie ungültiges HTML analysieren. Der größte Teil des HTML-Codes im Web ist jedoch fehlerhaft. Wenn Sie diese Unterschiede kennen, können Sie einige Fehler analysieren und entscheiden, welchen Parser Sie in einem Projekt verwenden möchten. Im Allgemeinen die lxml Parser ist eine sehr gute Wahl.

Objekte in schönen Suppe

Beautiful Soup analysiert das angegebene HTML-Dokument in einer Baumstruktur aus Python-Objekten. Es gibt vier Hauptobjekte in Python, die Sie kennen müssen: EtikettNavigableStringBeautifulSoup, und Kommentar.

Das Etikett Objekt bezieht sich auf ein tatsächliches XML- oder HTML-Tag im Dokument. Auf den Namen eines Tags können Sie mit zugreifen Verlinke den Namen. Sie können den Namen eines Tags auch auf etwas anderes setzen. Die Namensänderung wird in der von Beautiful Soup generierten Markierung sichtbar.

Mit können Sie auf verschiedene Attribute wie die Klasse und die ID eines Tags zugreifen Tag ['Klasse'] und Tag ['id'] beziehungsweise. Sie können auch mit auf das gesamte Attributwörterbuch zugreifen tag.attrs. Sie können auch die Attribute eines Tags hinzufügen, entfernen oder ändern. Die Attribute wie ein Element Klasse die mehrere Werte annehmen kann, werden als Liste gespeichert.

Der Text innerhalb eines Tags wird als a gespeichert NavigableString in der schönen Suppe. Es gibt einige nützliche Methoden wie replace_with ("string") um den Text innerhalb eines Tags zu ersetzen. Sie können auch eine konvertieren NavigableString mit Hilfe von Unicode ().

Mit Beautiful Soup können Sie auch auf die Kommentare einer Webseite zugreifen. Diese Kommentare werden als gespeichert Kommentar Objekt, das im Grunde auch ein ist NavigableString.

Sie haben bereits über das gelernt BeautifulSoup Objekt im vorherigen Abschnitt. Es wird verwendet, um das Dokument als Ganzes darzustellen. Da es sich nicht um ein tatsächliches Objekt handelt, hat es weder Namen noch Attribute.

Titel, Überschriften und Links abrufen

Sie können den Seitentitel und andere derartige Daten sehr einfach mit Beautiful Soup extrahieren. Lassen Sie uns die Wikipedia-Seite über Python kratzen. Zuerst müssen Sie das Markup der Seite mit dem folgenden Code basierend auf dem Tutorial des Anforderungsmoduls erhalten, um auf Webseiten zuzugreifen.

Importieren von Anforderungen aus bs4 Import BeautifulSoup req = request.get ('https://en.wikipedia.org/wiki/Python_ (programming_language)') soup = BeautifulSoup (req.text, "lxml")

Nachdem Sie die Suppe erstellt haben, können Sie den Titel der Webseite mithilfe des folgenden Codes abrufen:

soup.title # Python (Programmiersprache) - Wikipedia soup.title.name # 'title' soup.title.string # 'Python (Programmiersprache) - Wikipedia'

Sie können die Webseite auch nach anderen Informationen durchsuchen, z. B. nach der Hauptüberschrift oder dem ersten Absatz, deren Klassen oder dem Ich würde Attribut.

soup.h1 # 

Python (Programmiersprache)

soup.h1.string # 'Python (Programmiersprache)' soup.h1 ['class'] # ['firstHeading'] soup.h1 ['id'] # 'firstHeading' soup.h1.attrs # 'class': ['firstHeading'], 'id': 'firstHeading', 'lang': 'de' soup.h1 ['class'] = 'firstHeading, mainHeading' soup.h1.string.replace_with ("Python - Programmiersprache") ) del soup.h1 ['lang'] del soup.h1 ['id'] soup.h1 #

Python - Programmiersprache

Auf ähnliche Weise können Sie alle Verknüpfungen oder Unterüberschriften in einem Dokument mit folgendem Code durchlaufen:

für sub_heading in soup.find_all ('h2'): print (sub_heading.text) # alle Unterüberschriften wie Inhalt, Verlauf [Bearbeiten]… 

Im DOM navigieren

Sie können durch den DOM-Baum mit normalen Tag-Namen navigieren. Durch das Verketten dieser Tag-Namen können Sie den Baum tiefer navigieren. Sie können beispielsweise den ersten Link im ersten Absatz der angegebenen Wikipedia-Seite aufrufen, indem Sie verwenden Suppe.p.a. Auf alle Links im ersten Absatz kann mit zugegriffen werden soup.p.find_all ('a').

Sie können auch auf alle untergeordneten Elemente eines Tags als Liste zugreifen, indem Sie verwenden tag.contents. Um die Kinder an einen bestimmten Index zu bekommen, können Sie verwenden tag.contents [index]. Sie können auch die Kinder eines Tags mit Hilfe von durchlaufen .Kinder Attribut.

Beide .Kinder und .Inhalt sind nur hilfreich, wenn Sie auf die direkten oder ersten Nachkommen eines Tags zugreifen möchten. Um alle Nachkommen zu erhalten, können Sie die .Nachkommenschaft Attribut.

print (soup.p.contents) # [Python, 'ist eine weit verbreitete',… die vollständige Liste] print (soup.p.contents [10]) # Lesbarkeit für ein Kind in soup.p.children: print (child.name) # b # Keine # a # Keine # a # Keine #… und so weiter.

Sie können auch auf das übergeordnete Element eines Elements zugreifen .Elternteil Attribut. In ähnlicher Weise können Sie auf alle Vorfahren eines Elements mit der Taste zugreifen .Eltern Attribut. Das übergeordnete Element der obersten Ebene tag ist das BeautifulSoup Objekt selbst und sein übergeordnetes Element ist None.

print (soup.p.parent.name) # div für das übergeordnete Element in soup.p.parents: print (parent.name) # div # div # div # body # html # [Dokument]

Sie können auf das vorherige und das nächste Geschwister eines Elements zugreifen, indem Sie die .previous_sibling und .next_sibling Attribute. 

Damit zwei Elemente Geschwister sein können, sollten sie das gleiche Elternteil haben. Dies bedeutet, dass das erste untergeordnete Element eines Elements keinen vorherigen Bruder hat. Ebenso hat das letzte Kind des Elements kein nächstes Geschwister. Auf tatsächlichen Webseiten sind die vorherigen und nächsten Geschwister eines Elements höchstwahrscheinlich ein neues Zeilenzeichen. 

Sie können auch alle Geschwister eines Elements mit iterieren .vorherige_geschwister und .next_siblings.

soup.head.next_sibling # '\ n' soup.p.a.next_sibling # 'for' soup.p.a.previous_sibling # 'ist eine weit verbreitete' print (soup.p.b.previous_sibling) # Keine

Mit dem können Sie zu dem Element springen, das unmittelbar nach dem aktuellen Element kommt .next_element Attribut. Um auf das Element zuzugreifen, das sich unmittelbar vor dem aktuellen Element befindet, verwenden Sie die .vorheriges_element Attribut. 

Ebenso können Sie alle Elemente, die vor und nach dem aktuellen Element stehen, mit iterieren .vorherige_elemente und .next_elements beziehungsweise.

Abschließende Gedanken

Nach Abschluss dieses Lernprogramms sollten Sie nun die wichtigsten Unterschiede zwischen den verschiedenen HTML-Parsern gut verstehen. Sie sollten jetzt auch in der Lage sein, durch eine Webseite zu navigieren und wichtige Daten zu extrahieren. Dies kann hilfreich sein, wenn Sie alle Überschriften oder Links auf einer bestimmten Website analysieren möchten.

Im nächsten Teil der Serie lernen Sie, wie Sie mit der Beautiful Soup-Bibliothek das DOM suchen und ändern können.