Kratzen mit Python und schöner Suppe

Es gibt bereits viele Geschichten über das Scraping in Python in der Welt und in Qiita, aber ich denke, dass es viele Informationen gibt, die Pyquery einfach zu verwenden ist. Persönlich möchte ich, dass Sie die Güte von Beautiful Soup kennen, also möchte ich Beautiful Soup hier verwenden.

Übrigens ist dieser Eintrag hauptsächlich eine Zusammenfassung der Dokumentation zu Beautiful Soup 4. Weitere Informationen finden Sie in der Dokumentation.

Englisch http://www.crummy.com/software/BeautifulSoup/bs4/doc/

japanisch http://kondou.com/BS4/

Häufiges Missverständnis

Es gibt eine Meinung, dass Pyquery einfacher zu verwenden ist als Beautiful Soup, da es HTML mit einem CSS-Selektor wie jQuery verarbeiten kann, aber ** es kann auch mit Beautiful Soup durchgeführt werden. ** (Ich kenne die alte Version nicht) Ich werde unten erklären, wie es geht.

Über die Version

Die aktuelle Version ist Beautiful Soup 4. Bitte beachten Sie, dass es viele Kommentarartikel zu älteren Versionen gibt. Der Code, der mit Beautiful Soup3 funktioniert hat, sollte jedoch auch dann funktionieren, wenn Sie ihn in vielen Fällen durch Beautiful Soup4 ersetzen.

Installation

$ pip install beautifulsoup4

Einfach zu verwenden

Erstellen eines BeautifulSoup-Objekts

Beim Umgang mit einfachem HTML ist dies wie folgt.

from bs4 import BeautifulSoup

html = """
	<html>
	...
	</html>
"""

soup = BeautifulSoup(html)

Da URLs nicht direkt verarbeitet werden können, wird empfohlen, sie beim Umgang mit Websites mit urllib2 usw. zu kombinieren.

import urllib2
from bs4 import BeautifulSoup

html = urllib2.urlopen("http://example.com")

soup = BeautifulSoup(html)

Wenn Sie hier eine Warnung zum HTML-Parser erhalten, geben Sie den Parser entsprechend der Nachricht an. (Einzelheiten finden Sie unter [Über HTML-Parser](# html% E3% 83% 91% E3% 83% BC% E3% 82% B5% E3% 83% BC% E3% 81% AB% E3% 81% A4% E3% 81% 84% E3% 81% A6))

soup = BeautifulSoup(html, "html.parser")

So erhalten Sie ein einfaches Tag

Um alle A-Tags aus HTML zu erhalten

soup.find_all("a")

Das Objekt <class'bs4.element.ResultSet '>, das damit erhalten werden kann, kann wie eine Liste behandelt werden.

Um nur den ersten anstelle aller Tags zu erhalten

soup.find("a")

Oder

soup.a

oup.find ("a") und oup.a geben None zurück, wenn das Tag nicht im HTML vorhanden ist.

Tag-Informationen erhalten

Um die Attribute des erhaltenen Tags abzurufen

soup.a.get("href")

Um die Zeichen im erhaltenen Tag zu erhalten

soup.a.string

Natürlich können Sie auch verschachtelte Tags erhalten

soup.p.find_all("a")

Holen Sie sich Tags mit bestimmten Bedingungen

Sie können Tags leicht abrufen, indem Sie die Bedingungen nach Attributen eingrenzen. Um alle Tags mit der Linkklasse und der href von / link abzurufen, z. B. ""

soup.find_all("a", class_="link", href="/link")

Oder

soup.find_all("a", attrs={"class": "link", "href": "/link"})

Beachten Sie, dass class in Python ein reserviertes Wort ist, also class_.

Außerdem müssen Sie das Tag nicht angeben.

soup.find_all(class_="link", href="/link")
soup.find_all(attrs={"class": "link", "href": "/link"})

Tags mit regulären Ausdrücken abrufen

So rufen Sie alle Tags ab, die mit b beginnen, z. B. B-Tags und BODY-Tags

import re
soup.find_all(re.compile("^b"))

Um alle Tags zu erhalten, die href-Attribute haben, einschließlich "link"

import re
soup.find_all(href=re.compile("link"))

So erhalten Sie alle A-Tags, die "Hallo" in der Zeichenfolge innerhalb des Tags enthalten

import re
soup.find_all("a", text=re.compile("hello"))

Tags mit dem CSS-Selektor abrufen

Wenn Sie select anstelle von find_all verwenden, können Sie die Tags mit dem CSS-Selektor abrufen.

soup.select("#link1")
soup.select('a[href^="http://"]')

Umschreiben

Tags zu Tags hinzufügen

a = soup.find("a")
a["target"] = "_blank"

Verwenden Sie Unwrap, um das Tag zu entfernen

html = '''
<div>
    <a href="/link">spam</a>
</div>
'''

soup = BeautifulSoup(html)
soup.div.a.unwrap()

soup.div
# <div>spam</div>

Umgekehrt, wenn Sie ein neues Tag hinzufügen möchten, erstellen Sie ein Tag mit oup.new_tag und fügen Sie es mit wrap`` hinzu.

html = '''
<div>
    <a href="/link">spam</a>
</div>
'''

soup = BeautifulSoup(html)
soup.div.a.wrap(soup.new_tag("p"))

Darüber hinaus gibt es viele Operationsmethoden wie "Einfügen" und "Extrahieren", sodass Sie Inhalte und Tags flexibel hinzufügen und entfernen können.

Ausgabe

Durch Aufrufen von prettify können Sie es ordentlich formatieren und als Zeichenfolge ausgeben.

soup.prettify()

# <html>
#  <head>
#   <title>
#    Hello
#   </title>
#  </head>
#  <body>
#   <div>
#    <a href="/link">
#     spam
#    </a>
#   </div>
#   <div>
#    ...
#   </div>
#  </body>
# </html>
soup.div.prettify()

# <div>
#  <a href="/link">
#   spam
#  </a>
# </div>

Über HTML-Parser

Der HTML-Parser verwendet normalerweise den Python-Standard html.parser. Wenn jedoch lxml oder html5lib installiert ist, wird dieser bevorzugt verwendet. Geben Sie Folgendes an, um es explizit anzugeben.

soup = BeautifulSoup(html, "lxml")

Wenn Ihre Python-Version älter ist, kann html.parser sie möglicherweise nicht richtig analysieren. In meiner Umgebung konnte ich mit Python 2.7.3 und nicht mit Python 2.6 analysieren.

Es ist sicher, lxml oder html5lib so oft wie möglich zu installieren, um eine ordnungsgemäße Analyse zu ermöglichen. Lxml usw. hängen jedoch von der externen C-Bibliothek ab, sodass Sie sie je nach Umgebung möglicherweise installieren müssen.

Beiseite

Verwendung der schönen Suppe

In meinem Fall habe ich eine eigene Website, auf der mehrere Blog-Artikel zusammen in der Datenbank gespeichert sind. Normalerweise erhalte ich diese jedoch über RSS. Da die Anzahl der RSS-Dateien jedoch gering ist, ist HTML in diesem Fall Beautiful Soup Ich lese es mit und speichere den Inhalt.

Wenn der Hauptteil des gespeicherten Blogs angezeigt wird, werden unnötige Werbung entfernt und das Ziel im a-Tag angegeben, sodass der Link in einer neuen Registerkarte geöffnet wird.

Referenz: http://itkr.net

Ich denke, dass schöne Suppe für solche Anwendungen ausgezeichnet ist.

Recommended Posts

Kratzen mit Python und schöner Suppe
Versuchen Sie es mit Python + Beautiful Soup
Kratzen mit schöner Suppe
Tischkratzen mit schöner Suppe
Scraping mit Python
Mehrere Seiten mit Beautiful Soup verschrotten
Scraping mit Node, Ruby und Python
Scraping mit Python
Scraping mit Python, Selen und Chromedriver
Kratzen mit schöner Suppe in 10 Minuten
Website-Scraping mit Beautiful Soup in Python
[Python] Eine Tabelle mit Beautiful Soup kratzen
Üben des Web-Scrapings mit Python und Selen
Einfaches Web-Scraping mit Python und Ruby
Scraping in Python (Vorbereitung)
Versuchen Sie es mit Python.
Scraping mit Python + PhantomJS
Meine schöne Suppe (Python)
Ich habe mit Python verschiedene Dinge ausprobiert: Schaben (Beautiful Soup + Selenium + PhantomJS) und morphologische Analyse
Schaben mit Selen [Python]
Scraping mit Python + PyQuery
Scraping von RSS mit Python
Kratzen Sie das Essen mit Python und geben Sie es an CSV aus
Einstellungen bei Verwendung von Python 3-Anfragen und Beautiful Soup mit Crostini auf Chromebook
Sortieren Sie Anime-Gesichter, indem Sie Anime-Charakterseiten mit Beautiful Soup und Selenium abkratzen
Schreiben Sie einen einfachen kopflosen Web-Scraping-Bot in Python mit Beautiful Soup 4
Programmieren mit Python und Tkinter
Ich habe versucht, mit Python zu kratzen
Ver- und Entschlüsselung mit Python
Web Scraping mit Python + JupyterLab
Schaben mit Selen in Python
Python und Hardware-Verwenden von RS232C mit Python-
Schaben mit Selen + Python Teil 1
Schaben mit Chromedriver in Python
Scraping mit Selen in Python
Scraping mit Tor in Python
Kratzwettervorhersage mit Python
Schaben mit Selen + Python Teil 2
Python mit Pyenv und Venv
Ich habe versucht, mit Python zu kratzen
Web Scraping Anfänger mit Python
Krabbeltraining mit schöner Suppe
Funktioniert mit Python und R.
[Python] Löschen Sie, indem Sie ein Tag mit Beautiful Soup angeben
Automatisierte Testmethode, die Beautiful Soup und Selen (Python) kombiniert
Kommunizieren Sie mit FX-5204PS mit Python und PyUSB
Roboter läuft mit Arduino und Python
Installieren Sie Python 2.7.9 und Python 3.4.x mit pip.
Neuronales Netzwerk mit OpenCV 3 und Python 3
AM-Modulation und Demodulation mit Python
Schöne Suppe
Scraping mit Selen in Python (Basic)
[Python] Ein Memorandum der schönen Suppe4
JSON-Codierung und -Decodierung mit Python
Hadoop-Einführung und MapReduce mit Python
[GUI in Python] PyQt5-Drag & Drop-
[Scraping] Python-Scraping
Webcrawlen, Web-Scraping, Zeichenerfassung und Speichern von Bildern mit Python