Zurück zum Blog
Anleitungen
Mihai MaximLast updated on Mar 31, 20265 min read

Parsel: Wie man in Python Text aus HTML extrahiert

Parsel: Wie man in Python Text aus HTML extrahiert

Einleitung

Web-Scraping ist der automatisierte Prozess der Datenerfassung von Websites mithilfe eines Skripts oder Programms. Es wird verwendet, um Informationen wie Text, Bilder und andere Arten von Daten zu extrahieren, die für verschiedene Zwecke wie Forschung, Datenanalyse oder Marktanalyse nützlich sein können.

Heutzutage gibt es eine Vielzahl von Lösungen für das Web-Scraping mit Python. Selenium und Scrapy gehören zu den am weitesten verbreiteten und beliebtesten Bibliotheken. Diese Tools eignen sich zwar hervorragend für komplexe Scraping-Aufgaben, können für den gelegentlichen Gebrauch jedoch etwas überwältigend sein.

Hier kommt Parsel ins Spiel, die kleine Scraping-Bibliothek. Diese leichtgewichtige und leicht zu erlernende Bibliothek eignet sich perfekt für kleine Projekte und ist ideal für diejenigen, die noch keine Erfahrung mit Web-Scraping haben. Sie ist in der Lage, HTML zu parsen und Daten mithilfe von CSS- und XPath-Selektoren zu extrahieren, was sie zu einem großartigen Werkzeug für jeden Datenliebhaber macht, der nach einer schnellen und einfachen Möglichkeit sucht, Informationen aus dem Web zu sammeln.

Schnall dich an und mach dich bereit, den Umgang mit dieser Bibliothek zu erlernen, während du mich auf diesem Abenteuer der automatisierten Datenerfassung begleitest. Los geht’s mit dem Scraping!

Erste Schritte mit Parsel

Sie können die Parsel-Bibliothek mit folgendem Befehl installieren:

pip install parsel

Lassen Sie uns nun direkt in ein Beispielprojekt einsteigen und alle Länderdaten von dieser einfachen Website https://www.scrapethissite.com/pages/simple/ scrapen.

Um den HTML-Code von der Website abzurufen, müssen Sie eine HTTP-GET-Anfrage stellen.

Wir werden HTTP-Anfragen mit der Python-Bibliothek „requests“ stellen, stellen Sie also sicher, dass Sie diese installieren mit:

pip install requests

Jetzt kannst du den HTML-Code abrufen und in eine Datei schreiben:

import parsel

import requests

response = requests.get("https://www.scrapethissite.com/pages/simple/")

with open("out.html", "w", encoding="utf-8") as f:

f.write(response.text)

Und die Struktur untersuchen:

Unsere Daten sind in Strukturen gespeichert, die in etwa so aussehen:

<div class="col-md-4 country">

   <h3 class="country-name">

       <i class="flag-icon flag-icon-af"></i>

       Afghanistan

   </h3>

   <div class="country-info">

       <strong>Capital:</strong> <span class="country-capital">Kabul</span><br>

       <strong>Population:</strong> <span class="country-population">29121286</span><br>

       <strong>Area (km<sup>2</sup>):</strong> <span class="country-area">647500.0</span><br>

   </div>

</div><!--.col-->

Um Selektoren zu schreiben, müssen Sie den Roh-HTML-Code an Parsel übergeben:

import parsel

import requests

response = requests.get("https://www.scrapethissite.com/pages/simple/")

raw_html = response.text

parsel_dom = parsel.Selector(text = raw_html)

Jetzt sind wir bereit, einige Selektoren zu schreiben.

Text mit CSS-Selektoren extrahieren

Sie können die Hauptstadt des ersten Landes mit folgendem Befehl ausgeben:

parsel_dom = parsel.Selector(text=raw_html)

first_capital = parsel_dom.css(".country-capital::text").get()

print(first_capital)

// Output

Andorra la Vella

parsel_dom.css(".country-capital::text").get() will select the inner text of the first element that has the country-capital class.

Sie können alle Ländernamen mit folgendem Code ausgeben:

countries_names = filter(lambda line: line.strip() != "", parsel_dom.css(".country-name::text").getall())

for country_name in countries_names:

   print(country_name.strip())

// Output

Andorra

United Arab Emirates

Afghanistan

Antigua and Barbuda

Anguilla

. . .

parsel_dom.css(".country-name::text").getall() will select the inner texts of all the elements that have the "country-name" class.

Beachten Sie, dass wir die Ausgabe ein wenig bereinigen mussten. Wir haben dies getan, weil alle Elemente, die die Klasse „.country-name“ haben, auch ein verschachteltes <i>-Tag enthalten. Außerdem ist der Ländername von vielen nachgestellten Leerzeichen umgeben.

<h3 class="country-name">

 <i class="flag-icon flag-icon-ae"></i> //this is picked up as an empty string

  United Arab Emirates // this is picked up as “  United Arab Emirates  “

</h3>

Schreiben wir nun ein Skript, um alle Daten mit CSS-Selektoren zu extrahieren:

import parsel

import requests

response = requests.get("https://www.scrapethissite.com/pages/simple/")

raw_html = response.text

parsel_dom = parsel.Selector(text=raw_html)

countries = parsel_dom.css(".country")

countries_data = []

for country in countries:

  country_name = country.css(".country-name::text").getall()[1].strip()

  country_capital = country.css(".country-capital::text").get()

  country_population = country.css(".country-population::text").get()

  country_area = country.css(".country-area::text").get()

  countries_data.append({

     "name": country_name,

     "capital": country_capital,

     "population": country_population,

     "area": country_area

  })

for country_data in countries_data:

  print(country_data)

// Outputs

{'name': 'Andorra', 'capital': 'Andorra la Vella', 'population': '84000', 'area': '468.0'}

{'name': 'United Arab Emirates', 'capital': 'Abu Dhabi', 'population': '4975593', 'area': '82880.0'}

{'name': 'Afghanistan', 'capital': 'Kabul', 'population': '29121286', 'area': '647500.0'}

... 

Text mit XPath-Selektoren extrahieren

XPath ist eine Abfragesprache zum Auswählen von Knoten aus einem XML-Dokument. Es steht für „XML Path Language“ und verwendet eine Pfadnotation ähnlich der von URLs, um durch die Elemente und Attribute eines XML-Dokuments zu navigieren. Mit XPath-Ausdrücken lassen sich einzelne Elemente, eine Gruppe von Elementen oder ein bestimmtes Attribut eines Elements auswählen. XPath wird in erster Linie in XSLT verwendet, kann aber auch zur Navigation durch das Document Object Model (DOM) jedes XML-ähnlichen Sprachdokuments wie HTML oder SVG genutzt werden.

XPath mag auf den ersten Blick einschüchternd wirken, aber der Einstieg ist eigentlich recht einfach, sobald man die grundlegenden Konzepte und die Syntax verstanden hat. Eine hilfreiche Ressource ist unser Leitfaden zu XPath-Selektoren unter https://www.webscrapingapi.com/the-ultimate-xpath-cheat-sheet.

Probieren wir nun einige Selektoren aus:

So können Sie den ersten Großbuchstaben ausgeben:

parsel_dom = parsel.Selector(text=raw_html)

first_capital = parsel_dom.xpath('//*[@class="country-capital"]/text()').get()

print(first_capital)

// Output

Andorra la Vella

Und alle Ländernamen:

countries_names = filter(lambda line: line.strip() != "", 

parsel_dom.xpath('//*[@class="country-name"]//text()').getall())

for country_name in countries_names:

  print(country_name.strip())

// Output

Andorra la Vella

Abu Dhabi

Kabul

St. John's

The Valley

Tirana

...

Lassen Sie uns das Skript mit XPath-Selektoren neu implementieren:

import parsel

import requests

response = requests.get("https://www.scrapethissite.com/pages/simple/")

raw_html = response.text

parsel_dom = parsel.Selector(text=raw_html)

countries = parsel_dom.xpath('//div[contains(@class,"country")][not(contains(@class,"country-"))]')

countries_data = []

for country in countries:

 country_name = country.xpath(".//h3/text()").getall()[1].strip()

 country_capital = country.xpath(".//span/text()").getall()[0]

 country_population = country.xpath(".//span/text()").getall()[1]

 country_area = country.xpath(".//span/text()").getall()[2]

 countries_data.append({

    "name": country_name,

    "capital": country_capital,

    "population": country_population,

    "area": country_area

 })

for country_data in countries_data:

 print(country_data)

// Output

{'name': 'Andorra', 'capital': 'Andorra la Vella', 'population': '84000', 'area': '468.0'}

{'name': 'United Arab Emirates', 'capital': 'Abu Dhabi', 'population': '4975593', 'area': '82880.0'}

{'name': 'Afghanistan', 'capital': 'Kabul', 'population': '29121286', 'area': '647500.0'}

...

Elemente entfernen

Das Entfernen von Elementen ist einfach. Wende einfach die Funktion `drop` auf einen Selektor an:

selector.css(".my_class").drop()

Lassen Sie uns diese Funktionalität anhand eines Skripts veranschaulichen, das das Feld „Bevölkerung“ aus jedem Land entfernt:

import parsel

import requests

response = requests.get("https://www.scrapethissite.com/pages/simple/")

raw_html = response.text

parsel_dom = parsel.Selector(text=raw_html)

countries = parsel_dom.css(".country")

for country in countries:

 country.css(".country-population").drop()

 country.xpath(".//strong")[1].drop()

 country.xpath(".//br")[1].drop()

countries_without_population_html = parsel_dom.get()

with open("out.html", "w", encoding="utf-8") as f:

  f.write(countries_without_population_html)

Exportieren der Daten

Wenn du mit dem Scraping der Daten fertig bist, ist es wichtig, darüber nachzudenken, wie du sie speichern möchtest. Zwei gängige Formate zum Speichern dieser Art von Daten sind .json und .csv. Du solltest jedoch das Format wählen, das für die Anforderungen deines Projekts am besten geeignet ist.

Exportieren der Daten als .json

JSON (JavaScript Object Notation) ist ein schlankes Datenaustauschformat, das für Menschen leicht zu lesen und zu schreiben und für Maschinen leicht zu parsen und zu generieren ist. Es wird häufig für den Datenaustausch zwischen einer Webanwendung und einem Server oder zwischen verschiedenen Teilen einer Webanwendung verwendet. JSON ähnelt einem Python-Wörterbuch, da es zum Speichern von Daten in Schlüssel-Wert-Paaren verwendet wird und dazu dient, Daten desselben Typs und mit derselben Struktur zu speichern und darauf zuzugreifen.

Das Exportieren eines Arrays von Python-Wörterbüchern in das .json-Format kann mit der json-Bibliothek erfolgen:

import json

countries_dictionaries = [

{'name': 'Andorra', 'capital': 'Andorra la Vella', 'population': '84000', 'area': '468.0'},

{'name': 'United Arab Emirates', 'capital': 'Abu Dhabi', 'population': '4975593', 'area': '82880.0'}

]

json_data = json.dumps(countries_dictionaries, indent=4)

with open("data.json", "w") as outfile:

   outfile.write(json_data)

// data.json

[

   {

       "name": "Andorra",

       "capital": "Andorra la Vella",

       "population": "84000",

       "area": "468.0"

   },

   {

       "name": "United Arab Emirates",

       "capital": "Abu Dhabi",

       "population": "4975593",

       "area": "82880.0"

   }

]

Exportieren der Daten in das CSV-Format

Eine CSV-Datei ist eine einfache Möglichkeit, Daten in einer Textdatei zu speichern, wobei jede Zeile eine Spalte darstellt und jeder Wert durch ein Komma getrennt ist. Sie wird häufig in Tabellenkalkulations- oder Datenbankprogrammen verwendet. Python bietet durch sein csv-Modul eine hervorragende integrierte Unterstützung für die Arbeit mit CSV-Dateien. Eine der leistungsstärksten Funktionen des CSV-Moduls ist die DictWriter-Klasse, mit der Sie ein Python-Wörterbuch auf einfache Weise in eine CSV-Datei schreiben können. Die Schlüssel des Dictionaries werden als Spaltenüberschriften in der CSV-Datei verwendet, und die Werte werden als entsprechende Daten in die Zeilen geschrieben.

So können Sie die csv-Bibliothek verwenden, um ein Array von Python-Wörterbüchern in eine CSV-Datei zu exportieren.

countries_dictionaries = [

{"name": "John Smith", "age": 35, "city": "New York"},

{"name": "Jane Doe", "age": 28, "city": "San Francisco"}

]

with open("data.csv", "w") as outfile:

   writer = csv.DictWriter(outfile, fieldnames=countries_dictionaries[0].keys())

   writer.writeheader()

   for row in countries_dictionaries:

       writer.writerow(row)

// data.csv

name,age,city

John Smith,35,New York

Jane Doe,28,San Francisco

Zusammenfassung

In diesem Artikel haben wir die Verwendung der Parsel-Bibliothek in Python untersucht. Wir haben gesehen, wie einfach es ist, die von Parsel bereitgestellten CSS- und XPath-Selektoren zu nutzen, um Daten aus Webseiten zu extrahieren. Insgesamt bietet Parsel eine effiziente und vielseitige Lösung für das Web-Scraping. Wenn Sie an der Automatisierung der Datenerfassung interessiert sind, sollten Sie es auf jeden Fall ausprobieren.

Möchten Sie mehr über Web-Scraping erfahren? Schauen Sie sich unser Produkt WebScrapingAPI an und entdecken Sie, wie Sie Ihre Fähigkeiten zur Datenextraktion auf die nächste Stufe heben können. Unsere leistungsstarke API wurde speziell entwickelt, um Ihnen bei den häufigsten Herausforderungen des Web-Scrapings zu helfen, wie zum Beispiel das Umgehen von IP-Sperren oder das Rendern von JavaScript. Und das Beste daran? Sie können sie kostenlos testen!

Über den Autor
Mihai Maxim, Full-Stack-Entwickler @ WebScrapingAPI
Mihai MaximFull-Stack-Entwickler

Mihai Maxim ist Full-Stack-Entwickler bei WebScrapingAPI, wo er in verschiedenen Bereichen des Produkts mitwirkt und an der Entwicklung zuverlässiger Tools und Funktionen für die Plattform mitarbeitet.

Los geht’s

Sind Sie bereit, Ihre Datenerfassung zu erweitern?

Schließen Sie sich den über 2.000 Unternehmen an, die WebScrapingAPI nutzen, um Webdaten im Unternehmensmaßstab ohne zusätzlichen Infrastrukturaufwand zu extrahieren.