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/
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.
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.
$ pip install beautifulsoup4
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")
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.
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")
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"})
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"))
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://"]')
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.
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>
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.
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