Python-Anfänger bleiben beim ersten Web-Scraping stecken

Einführung

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.

Umgebung

Daten von mehreren Seiten abrufen

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)

Ich möchte das Programm auch bei einem unerwarteten Fehler nicht stoppen

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

Text mit .string kann nicht abgerufen werden

Wenn 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.

Ich möchte das n-te Tag angeben

# <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 "

" angesehen werden, also "n-tes Kind (4)" Kann auch angegeben werden.

Der CSS-Selektor funktioniert nicht wie erwartet

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)')

Barrieren mit Python3, Windows und Zeichencode

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()

abschließend

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 ...

Referenzseite

  • https://lets-hack.tech/programming/languages/python/bs4-text-or-string/
  • https://qiita.com/butada/items/33db39ced989c2ebf644

Recommended Posts

Python-Anfänger bleiben beim ersten Web-Scraping stecken
Web Scraping mit Python Erster Schritt
[Für Anfänger] Versuchen Sie Web Scraping mit Python
Web Scraping mit Python + JupyterLab
Web Scraping Anfänger mit Python
Ich habe versucht, WebScraping mit Python.
Holen Sie sich Web-Screen-Capture mit Python
Holen Sie sich Qiita-Trends mit Python-Scraping
Web Scraping für Anfänger in Python (1)
Web Scraping für Anfänger in Python (4) -1
Holen Sie sich Wetterinformationen mit Python & Scraping
[Für Anfänger] Web-Scraping mit Python "Greifen Sie auf die URL auf der Seite zu, um den Inhalt abzurufen."
Abrufen von Eigenschaftsinformationen durch Scraping mit Python
Scraping mit Python
WEB-Scraping mit Python (für persönliche Notizen)
Scraping mit Python
Erste Schritte mit Python Web Scraping Practice
[Persönlicher Hinweis] Scraping von Webseiten in Python3
Pferderennseite Web Scraping mit Python
Erste Schritte mit Python Web Scraping Practice
Üben des Web-Scrapings mit Python und Selen
Einfaches Web-Scraping mit Python und Ruby
Wie Python-Anfänger mit Progete beginnen
Führen Sie das WEB-Scraping regelmäßig mit AWS-Lambda + Python + Cron aus
Die erste Web-App, die von Python-Anfängern erstellt wurde
Web Scraping mit Python (Wettervorhersage)
Web Scraping mit Python (Aktienkurs)
[Cloud102] # 1 Erste Schritte mit Python (Teil 1 Python Erste Schritte)
Scraping in Python (Vorbereitung)
Versuchen Sie es mit Python.
Scraping mit Python + PhantomJS
Holen Sie sich ein Date mit Python
Schaben mit Selen [Python]
Scraping mit Python + PyQuery
Scraping von RSS mit Python
Web Scraping für Anfänger in Python (1) Verbesserte Version
Datenanalyse zur Verbesserung von POG 1 ~ Web Scraping mit Python ~
Web-Scraping für Anfänger mit Python (4) --2 Scraping auf Cloud Shell
Holen Sie sich den Ländercode mit Python
Ich habe versucht, mit Python zu kratzen
Schaben mit Selen in Python
Schaben mit Selen + Python Teil 1
Holen Sie sich Twitter-Timeline mit Python
Festliches Scraping mit Python, Scrapy
Speichern Sie Bilder mit Web Scraping
Holen Sie sich Youtube-Daten mit Python
Erste Nervenzellsimulation mit NEURON + Python
Scraping mit Tor in Python
Web-API mit Python + Falcon
Holen Sie sich die Thread-ID mit Python
Web Scraping mit Selenium (Python)
Kratzwettervorhersage mit Python
Schaben mit Selen + Python Teil 2
Beginnen Sie mit Python! ~ ② Grammatik ~
Webanwendung mit Python + Flask ② ③
Ich habe versucht, mit Python zu kratzen