Als ich Web Scraping ausprobierte, ohne die Grammatik von Python zu kennen, blieb ich auf verschiedene Weise stecken, daher werde ich es mit einem Memorandum zusammenfassen. Die Implementierung ist ein Programm, das Getränkedaten von einer bestimmten Website erfasst und in eine CSV-Datei ausgibt.
Ich habe schnell einen Weg gefunden, Daten von einer Seite abzurufen, aber wie kann ich sie von mehreren Seiten abrufen?
import requests
from bs4 import BeautifulSoup
import re
#Ein Array, das URLs für mehrere Seiten enthält
urls_ary = []
#Durchsuchen Sie alle Tags auf der obersten Seite, rufen Sie ihre href-Attribute ab und fügen Sie sie dem Array hinzu
url = 'http://hoge/top'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')
for a in soup.find_all('a', href=re.compile('^huga')):
urls_ary.append(a.get('href'))
#Anordnung, um Getränkedaten zu setzen
drinks_ary = []
#Drehen Sie eine Schleife, um auf alle Seiten zuzugreifen
for page in urls_ary:
url = 'http://hoge/top/'
r = requests.get(url + str(page))
soup = BeautifulSoup(r.text, 'lxml')
#Wenn das span-Tag den Getränkenamen enthält, rufen Sie das span-Tag ab
tag = soup.find('span')
drinks_ary.append(tag)
find_all ('a', href = re.compile ('^ huga'))
werden alle Tags, deren Links mit huga
(<a '' beginnen) angezeigt. Ich versuche nur href = "huga ...> </a>"
) zu bekommen.find_all ('a')
ohne diese Option. Keine Notwendigkeit für "Import Re".Wie oben erwähnt, war ich traurig, dass der Prozess aufgrund eines unerwarteten Fehlers beim Drehen in einer Schleife gestoppt wurde und das Programm erneut von 1 gedreht wurde.
Auch wenn ein Fehler auftritt, möchte ich ihn vorerst ignorieren und den Vorgang beenden.
Sie können Ausnahmen behandeln, indem Sie try
und exception
verwenden.
for page in urls_ary:
url = 'http://hoge/top/'
r = requests.get(url + str(page))
soup = BeautifulSoup(r.text, 'lxml')
#Probieren Sie Code an, der Fehler verursachen kann, except
try:
tag = soup.find('span')
drinks_ary.append(tag)
#Wenn ein Fehler auftritt, überspringen Sie diesen Vorgang und geben Sie die nächste Schleife ein.
except:
continue
.string
kann nicht abgerufen werdenWenn Sie .text
verwenden, können Sie es vorerst erhalten.
Weitere Informationen zu den Unterschieden zwischen .string
und .text
finden Sie unter Dieser Artikel (Klare Unterschiede im String- und Textverhalten in Beautiful Soup - Python) / language / python / bs4-text-or-string /) war persönlich leicht zu verstehen.
# <html>
# <body>
# <ul>
# <li>Unbestimmt</li>
# <li>Unbestimmt</li>
# <li>Es ist angegeben</li>
# <li>Unbestimmt</li>
# </ul>
# </body>
# </html>
import requests
from bs4 import BeautifulSoup
url = 'http://hoge/top'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')
#Dritte<li>Tag holen
li_3rd = soup.select(body > ul > li:nth-of-type(3))
Übrigens kann es mit nth-child ()
angegeben werden, aber das Verhalten ist komplizierter als nth-of-type
.
# <html>
# <body>
# <div>
# <h1>Unbestimmt</h1>
# <p>Unbestimmt</p>
# <h2>Unbestimmt</h2>
# <p>angeben</p>
# </div>
# </body>
# </html>
#Zweite<p>Ich möchte einen Tag bekommen
# nth-of-type
soup.select('body > div > p:nth-of-type(2)')
# nth-child
soup.select('body > div > nth-child(4)')
Es ist einfach, das n-te-Typ
zu verwenden, da ich das zweite <p>
Tag innerhalb des <div>
Tags erhalten möchte.
Sei es "n-ter Typ (2)".
Andererseits kann das zweite "
" - Tag als das vierte der Tags in "
Wenn Sie das HTML einer Website mit dem Entwicklertool von Chrome (?) Überprüfen und einen darauf basierenden CSS-Selektor angeben, erhalten Sie selten ein anderes Element als das angegebene.
Dies ist auf der Website-Seite, wo es ein Start-Tag für s und html gibt, aber kein Close-Tag, und auf der Chrome-Seite, wo das <tbody>
-Tag willkürlich in das <table>
-Tag eingefügt wird. Oft ein Problem.
Da sie in den Entwicklertools nicht identifiziert werden können, muss die Seitenquelle angezeigt und überprüft werden, ob das schließende Tag fehlt.
Übrigens, wenn das schließende Tag nicht ausreicht, sollten Sie wie folgt damit umgehen.
#Fehlende Div Closing Tag HTML
# <html>
# <body>
# <div>
# <h1>Unbestimmt</h1>
# <p>Unbestimmt</p>
# <h2>Unbestimmt</h2>
# <p>angeben</p>
# </body>
# </html>
#Div-Tag entfernen
for tag_div in soup.find_all('div'):
tag_div.unwrap()
tag_p = soup.select('body > p:nth-of-type(2)')
Ich hatte Probleme mit "UnicodeEncodeError", als ich versuchte, die abgerufenen Daten in einer Datei im CSV-Format zu speichern. Dieser Artikel (Ursachen und Problemumgehungen für UnicodeEncodeError in (Windows) Python 3) war besonders hilfreich. Es gab viele andere Artikel, die ich gegoogelt und erwähnt habe, aber ich werde sie hier weglassen, weil es zu viele gibt.
Übrigens konnte ich es mit dem folgenden Code erfolgreich speichern.
import csv
import codecs
#Ein Array mit den Daten, die Sie speichern möchten
drinks_data = ['hoge', 'hogehoge', 'hugahuga']
#Als CSV speichern
f = codecs.open('data/sample.csv', 'wb', 'cp932', 'ignore')
writer = csv.writer(f)
writer.writerows(drinks_data)
f.close()
Das Obige ist eine Zusammenfassung des Inhalts des ersten Scrapings für Anfänger von Python. Ich vergesse nicht die Traurigkeit, als das Programm, das ich ausgeführt habe, weil ich falsch verstanden habe, dass es abgeschlossen wurde, eine Stunde später mit einem Fehler gestoppt und von vorne begonnen wurde ... Ausnahmebehandlung ... Immer beachten ...
Recommended Posts