1. Pozyskiwanie danych tabelarycznych
Co łączy tabele i cebule? Tak, warstwy!
Tabele w HTML są jak swoista warstwowa zapiekanka, która składa się z elementów
<table>
,
<tr>
(wiersze),
<th>
(komórki-nagłówki) i
<td>
(zwykłe komórki). Każdy z tych
elementów pełni swoją rolę w przedstawianiu danych, a żeby
wyciągnąć z nich informacje, należy dotrzeć do każdej
warstwy po kolei.
Praktyka, praktyka i jeszcze raz praktyka!
Zacznijmy od następującej prostej tabeli HTML:
<table>
<tr>
<th>Imię</th>
<th>Wiek</th>
<th>Miasto</th>
</tr>
<tr>
<td>Alicja</td>
<td>29</td>
<td>Moskwa</td>
</tr>
<tr>
<td>Bob</td>
<td>34</td>
<td>Sankt Petersburg</td>
</tr>
</table>
Krok 1: Znalezienie tabeli na stronie
Tabele na stronach internetowych identyfikujemy przy pomocy
tagu HTML <table>
, a dane w tabelach
znajdują się w tagach <tr>
(wiersze) i
<td>
(komórki danych). W
BeautifulSoup
metoda find
pomaga
znaleźć pierwszą tabelę na stronie, a find_all
— uzyskać wszystkie tabele, jeśli jest ich kilka.
# Znalezienie pierwszej tabeli na stronie
table = soup.find("table")
Jeśli trzeba wyciągnąć konkretną tabelę, można sprecyzować
wyszukiwanie, podając atrybuty tabeli, takie jak
id
lub class
.
# Znalezienie tabeli po klasie
table = soup.find("table", {"class": "table-class"})
Krok 2: Pozyskiwanie danych z tabeli
Po załadowaniu można przystąpić do pozyskania danych. Dane w tabeli są rozmieszczone w wierszach, więc logicznym krokiem jest przejście przez wiersze tabeli i wyciągnięcie danych z każdej komórki.
Pozyskiwanie nagłówków
Nagłówki tabeli zazwyczaj są w pierwszym wierszu i ujęte w
tagi <th>
. Wykorzystanie
find_all
pozwala zebrać wszystkie nagłówki w
liście.
# Pozyskiwanie nagłówków z pierwszego wiersza tabeli
headers = []
header_row = table.find("tr")
for th in header_row.find_all("th"):
headers.append(th.text.strip())
print("Nagłówki tabeli:", headers)
Pozyskiwanie wierszy danych
Aby pozyskać wszystkie wiersze danych (zwykle ujęte w tagi
<tr>
, a każda komórka — w
<td>
) użyjemy zagnieżdżonej pętli:
najpierw znajdziemy wszystkie wiersze
<tr>
, a następnie przeprowadzimy iterację
po komórkach <td>
w każdym wierszu.
# Pozyskiwanie wszystkich wierszy danych
data = []
rows = table.find_all("tr")[1:] # Pominięcie pierwszego wiersza z nagłówkami
for row in rows:
row_data = []
for cell in row.find_all("td"):
row_data.append(cell.text.strip())
data.append(row_data)
print("Dane tabeli:", data)
Ten kod elegancko iteruje przez wiersze tabeli i wyciąga tekst z każdej komórki. Czy to nie magia? Oczywiście, wszyscy wiemy, że nie ma magii bez pętli!
2. Praca z listami
Listy – starsi bracia tabel
W życiu istnieją dwie nieskończone rzeczy: tabele i listy.
Listy są reprezentowane przez elementy
<ul>
(nienumerowane) i
<ol>
(numerowane), a ich elementami są
<li>
. W odróżnieniu od tabel, listy są
proste i minimalistyczne. To czyni je idealnymi kandydatami do
szybkiej i efektywnej obróbki danych!
Pozyskiwanie danych z list
Spójrzmy na przykład listy HTML:
<ul>
<li>Jabłko</li>
<li>Banan</li>
<li>Winogrona</li>
</ul>
Teraz użyjmy naszego starego-dobrego BeautifulSoup
,
aby pozyskać te dane:
html = """
<ul>
<li>Jabłko</li>
<li>Banan</li>
<li>Winogrona</li>
</ul>
"""
soup = BeautifulSoup(html, 'html.parser')
ul = soup.find('ul')
items = ul.find_all('li')
for item in items:
print(item.get_text())
I to wszystko! Proste, ale efektywne podejście, które możesz zastosować także do bardziej skomplikowanych struktur.
3. Przykład pozyskiwania i przetwarzania danych tabelarycznych
Aby utrwalić wiedzę, spróbujmy pozyskać dane z analogicznego przykładu w praktyce, ale o bardziej złożonej strukturze:
<table id="courses">
<tr>
<th>Kurs</th>
<th>Instruktor</th>
</tr>
<tr>
<td>Python dla wszystkich</td>
<td>Guido van Rossum</td>
</tr>
<tr>
<td>Automatyzacja z Pythonem</td>
<td>Eric Matthes</td>
</tr>
</table>
<ul class="technologies">
<li>Python</li>
<li>JavaScript</li>
<li>HTML & CSS</li>
</ul>
Aby pozyskać dane z tabeli i listy, można ustawić zapytania w następujący sposób:
html = """
<table id="courses">
<tr>
<th>Kurs</th>
<th>Instruktor</th>
</tr>
<tr>
<td>Python dla wszystkich</td>
<td>Guido van Rossum</td>
</tr>
<tr>
<td>Automatyzacja z Pythonem</td>
<td>Eric Matthes</td>
</tr>
</table>
<ul class="technologies">
<li>Python</li>
<li>JavaScript</li>
<li>HTML & CSS</li>
</ul>
"""
soup = BeautifulSoup(html, 'html.parser')
# Pozyskiwanie danych z tabeli
course_table = soup.find('table', id='courses')
course_rows = course_table.find_all('tr')
for row in course_rows:
cells = row.find_all(['th', 'td'])
for cell in cells:
print(cell.get_text())
print("---")
# Pozyskiwanie danych z listy
tech_list = soup.find('ul', class_='technologies')
tech_items = tech_list.find_all('li')
for item in tech_items:
print(item.get_text())
Ten skrypt obejmuje oba typy danych. Zwróć uwagę, jak wykorzystujemy identyfikatory i klasy do dokładnego znajdowania elementów. W praktyce możesz natknąć się na bardziej złożone struktury HTML, ale droga pozostaje ta sama: zaczynamy od najwyższego poziomu, analizujemy elementy i na końcu pozyskujemy cenne dane!
4. Częściowe podsumowanie i częste błędy
Praca z tabelami i listami na stronach internetowych to jak nawigacja po labiryncie. Czasami możemy napotkać niepełne dane, takie jak puste komórki lub brakujące elementy. W takich przypadkach ważne jest sprawdzanie poprawności danych. Częste błędy mogą obejmować próby dostępu do elementów, których nie ma, lub nieprawidłowe użycie selektorów. Warto pamiętać, że HTML nie zawsze jest idealnie czysty i uporządkowany, dlatego zawsze warto uwzględniać obsługę wyjątków i walidację danych.
Gdzie to się może przydać?
Wiedza zdobyta na tym wykładzie pomoże Ci automatycznie pozyskiwać i przetwarzać dane z wielu źródeł online. Na przykład możesz zautomatyzować zbieranie danych z tabel giełdowych, śledzenie cen w sklepach internetowych, a nawet przeprowadzać regularną analizę danych z blogów i serwisów informacyjnych. Opanowanie techniki pozyskiwania danych z tabel i list otwiera przed Tobą świat możliwości w zakresie automatyzacji i analizy danych.
GO TO FULL VERSION