Python-Extraktionstabelle von der Webseite

Salman Mehmood 21 Juni 2023
  1. Python-Extraktionstabelle von der Webseite
  2. Python-Extraktionstabelle von der Webseite mit Pandas
  3. Python-Extraktionstabelle von der Webseite mit lxml
Python-Extraktionstabelle von der Webseite

Das Hauptziel dieses Artikels ist es zu zeigen, wie Tabellen mit Pandas und lxml in Python aus einer Webseite extrahiert werden können.

Python-Extraktionstabelle von der Webseite

Daten sind in dieser modernen Ära, in der viele Informationen täglich mit hoher Frequenz verarbeitet, gespeichert und extrahiert werden, von großer Bedeutung. In diesem Zusammenhang kann unser Projekt verlangen, dass wir Daten von einem bestimmten Online-Speicherort, Repository oder einer Webseite extrahieren.

Dies kann in zahlreichen Anwendungsfällen eine Möglichkeit sein. Möglicherweise ist es aus zahlreichen Gründen erforderlich, auf eine öffentliche Aufzeichnungsseite zuzugreifen, um Daten zu extrahieren, zu verarbeiten und zu speichern oder Daten aus unserem Repository zu extrahieren.

Es gibt bessere Möglichkeiten, dies zu tun, aber nehmen wir der Einfachheit halber an, dass dies der erforderliche Weg ist.

Um dieser Situation Herr zu werden, müssen wir eine Lösung entwickeln, die die Verbindung zur Webseite herstellt, die Seite durchliest, alle Tabellen findet (falls vorhanden), sie korrekt extrahiert und in einem geeigneten Format speichert. Damit es in unserem Programm verarbeitet werden kann.

Die Lösung dieses Problems kann auf mehrere Arten angegangen werden, von denen zwei im Folgenden erwähnt werden:

Python-Extraktionstabelle von der Webseite mit Pandas

Bevor Sie fortfahren, vergewissern Sie sich, dass Sie die folgenden Module/Pakete installiert haben:

  1. lxml
  2. html5lib
  3. Schöne Suppe4

Die genannten Pakete können Sie mit pip mit folgendem Befehl installieren:

pip install lxml html5lib BeautifulSoup4

Dies ergibt die folgende Ausgabe:

Collecting lxml
  Downloading lxml-4.9.1-cp310-cp310-win_amd64.whl (3.6 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.6/3.6 MB 37.9 kB/s eta 0:00:00
Requirement already satisfied: html5lib in c:\program files\python310\lib\site-packages (1.1)
Collecting BeautifulSoup4
  Downloading beautifulsoup4-4.11.1-py3-none-any.whl (128 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 128.2/128.2 kB 29.0 kB/s eta 0:00:00
Requirement already satisfied: webencodings in c:\program files\python310\lib\site-packages (from html5lib) (0.5.1)
Requirement already satisfied: six>=1.9 in c:\program files\python310\lib\site-packages (from html5lib) (1.16.0)
Collecting soupsieve>1.2
  Downloading soupsieve-2.3.2.post1-py3-none-any.whl (37 kB)
Collecting requests
  Downloading requests-2.28.1-py3-none-any.whl (62 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 62.8/62.8 kB 420.8 kB/s eta 0:00:00
Collecting urllib3<1.27,>=1.21.1
  Downloading urllib3-1.26.12-py2.py3-none-any.whl (140 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 140.4/140.4 kB 1.0 MB/s eta 0:00:00
Collecting idna<4,>=2.5
  Downloading idna-3.4-py3-none-any.whl (61 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 61.5/61.5 kB 121.6 kB/s eta 0:00:00
Collecting charset-normalizer<3,>=2
  Downloading charset_normalizer-2.1.1-py3-none-any.whl (39 kB)
Collecting certifi>=2017.4.17
  Downloading certifi-2022.9.24-py3-none-any.whl (161 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 161.1/161.1 kB 1.4 MB/s eta 0:00:00
Installing collected packages: urllib3, idna, charset-normalizer, certifi, requests, soupsieve, lxml, BeautifulSoup4
Successfully installed BeautifulSoup4-4.11.1 lxml-4.9.1 soupsieve-2.3.2.post1 certifi-2022.9.24 charset-normalizer-2.1.1 idna-3.4 requests-2.28.1 urllib3-1.26.12

Nachdem die erforderlichen Module installiert wurden, ist es an der Zeit, mit dem Implementierungsteil fortzufahren.

Betrachten Sie den folgenden Code:

import requests
import pandas as pd

url = "https://www.ffiec.gov/census/report.aspx?year=2020&county=009&state=09&report=demographic"

html = requests.get(url).content
df_list = pd.read_html(html)
df = df_list[-1]
print(df)

Dies ergibt die folgende Ausgabe:

    Tract Code Tract Income Level Distressed or Under-served Tract  ...  Minority Population Owner Occupied Units 1- to 4- Family Units
1       1202.0           Moderate                                No  ...                 3040                  918                  2010
2       1251.0             Middle                                No  ...                  551                 1400                  1555
3       1252.0           Moderate                                No  ...                 2088                 1139                  1992
4       1253.0           Moderate                                No  ...                 2443                  728                  1814
..         ...                ...                               ...  ...                  ...                  ...                   ...
95      1714.0           Moderate                                No  ...                 1278                  141                   638
96      1715.0           Moderate                                No  ...                 2241                  396                  1274
97      1716.0             Middle                                No  ...                 1466                 1378                  1803
98      1717.0             Middle                                No  ...                  820                 1456                  1647
99      1751.0             Middle                                No  ...                  851                  669                  1240

[100 rows x 12 columns]

Mit der Pandas-Bibliothek ist es einfach, Tabellen von jeder Webseite zu extrahieren. Die read_html-Methode der Pandas-Bibliothek kann verwendet werden, um Daten von Webseiten zu lesen und zu extrahieren und sie dann in Datenrahmen umzuwandeln, um die reibungslose Verarbeitung von Daten zu unterstützen, da sie zu Dataframe-Objekten werden.

Die extrahierten Tabellen können auch mit der Methode to_csv in eine CSV-Datei gespeichert werden, die das Dataframe-Objekt in eine CSV-Datei speichert.

Python-Extraktionstabelle von der Webseite mit lxml

Betrachten Sie den folgenden Code:

from lxml import etree
import urllib.request

site = "https://www.ffiec.gov/census/report.aspx?year=2020&county=009&state=09&report=demographic"

hdr = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.3",
    "Accept-Encoding": "none",
    "Accept-Language": "en-US,en;q=0.8",
    "Connection": "keep-alive",
}


request = urllib.request.Request(site, headers=hdr)
web = urllib.request.urlopen(request)
s = web.read()
html = etree.HTML(s)


# Get all 'tr'
tr_nodes = html.xpath('//table[@id="Report1_dgReportDemographic"]/tr')

# 'th' is inside first 'tr'
headers = [i.text for i in tr_nodes[0].xpath("th")]

# Get text from rest all 'tr'
td_content = [[td.text for td in tr.xpath("td")] for tr in tr_nodes[1:]]

for head in headers:
    print(head, end=" ")

print("")

for content in td_content:
    print(content)

Dies ergibt die folgende Ausgabe:

Tract Code Tract Income Level  Distressed or Under   Tract Median Family Income % 2020 FFIEC Est. MSA/MD non-MSA/MD Median Family Income 2020 Est. Tract Median Family Income 2015 Tract Median Family Income Tract Population Tract Minority % Minority Population Owner Occupied Units 1- to 4- Family Units
['1201.00', 'Middle', 'No', '93.64', '$91,800', '$85,962', '$75,611', '6013', '26.44', '1590', '1862', '2248']
['1202.00', 'Moderate', 'No', '68.12', '$91,800', '$62,534', '$55,000', '6783', '44.82', '3040', '918', '2010']
['1251.00', 'Middle', 'No', '109.80', '$91,800', '$100,796', '$88,654', '4477', '12.31', '551', '1400', '1555']
['1252.00', 'Moderate', 'No', '62.55', '$91,800', '$57,421', '$50,506', '5912', '35.32', '2088', '1139', '1992']
['1253.00', 'Moderate', 'No', '57.28', '$91,800', '$52,583', '$46,250', '5164', '47.31', '2443', '728', '1814']
.
.
.
.
.

Es ist auch möglich, mit lxml und urllib Tabellen aus einer Webseite zu extrahieren und zu verarbeiten. Wie aus dem Code hervorgeht, müssen wir der Anfrage einen benutzerdefinierten Header bereitstellen. andernfalls wird ein 403: Forbidden-Fehler empfangen.

Nachdem die Anfrage erfolgreich war, wird eine Suche nach der Tabelle durchgeführt (speziell für diese Site), wonach wir die Überschriften und den Inhalt (Zeilen) manuell aus der Tabelle extrahieren.

Obwohl diese Option etwas langwieriger und komplexer ist als das Pandas-Modul, ist sie nützlich, wenn mehr Kontrolle und Freiheit darüber erforderlich sind, was extrahiert werden soll und was nicht.

Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn