CodeGym /Kursy /Python SELF PL /Zbieranie danych z tabel i list

Zbieranie danych z tabel i list

Python SELF PL
Poziom 32 , Lekcja 2
Dostępny

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:

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.

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

Python

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

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

Python

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

HTML

<ul>
  <li>Jabłko</li>
  <li>Banan</li>
  <li>Winogrona</li>
</ul>

Teraz użyjmy naszego starego-dobrego BeautifulSoup, aby pozyskać te dane:

Python

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:

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>

Aby pozyskać dane z tabeli i listy, można ustawić zapytania w następujący sposób:

Python

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.

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION