CodeGym /Kursy /Python SELF PL /Pobieranie danych według tagów HTML i atrybutów

Pobieranie danych według tagów HTML i atrybutów

Python SELF PL
Poziom 31 , Lekcja 3
Dostępny

1. Nawigacja po drzewie HTML

Dziś zanurzymy się w tajemniczy świat drzew HTML i nauczymy się pobierać informacje ze stron internetowych jak prawdziwi ninja programowania. Nadal będziemy korzystać z magicznej biblioteki BeautifulSoup, by dotrzeć do potrzebnych danych i ulepszyć nasze już całkiem inteligentne skrypty o nową funkcjonalność. Więc podkręć klawiaturę i zaczynamy!

A więc, zanim zabierzemy się za pobieranie danych, przyjrzyjmy się jeszcze raz, czym jest drzewo HTML. Wyobraźmy sobie to jako wielkie drzewo genealogiczne, gdzie każdy tag to osobny krewny. Mamy rodziców, dzieci, rodzeństwo. Nasze zadanie - to znaleźć określonych „krewnych”, aby delikatnie wydobyć z nich cenne rodzinne relikwie (lub dane).

Tak może wyglądać kawałek HTML:

HTML

<div class="article">
    <h2 id="title">Nagłówek</h2>
    <p class="content">To jest tekst artykułu...</p>
    <a href="https://example.com" class="link">Czytaj dalej</a>
</div>

Tutaj mamy div, który jest elementem nadrzędnym dla h2, p, i a. Każdy z nich ma swoje atrybuty i zawartość.

2. Pobieranie danych według tagów

BeautifulSoup oferuje wygodne metody do nawigacji po drzewie i pobierania danych. Zacznijmy od podstawowej metody find(), która pozwala znaleźć pierwszy element z określonym tagiem. Natomiast find_all() to jak buldożer wyszukiwania, który wykopuje wszystkie elementy z danym tagiem.

python
                      
                        from bs4 import BeautifulSoup
                
                        html_doc = """<div class="article">
                                        <h2 id="title">Nagłówek</h2>
                                        <p class="content">To jest tekst artykułu...</p>
                                        <a href="https://example.com" class="link">Czytaj dalej</a>
                                     </div>"""
                        
                        soup = BeautifulSoup(html_doc, 'html.parser')
                        
                        # Znajdujemy pierwszy paragraf
                        first_paragraph = soup.find('p')
                        print(first_paragraph.text)  # Wyjście: To jest tekst artykułu...
                        
                        # Znajdujemy wszystkie linki
                        all_links = soup.find_all('a')
                        for link in all_links:
                            print(link['href'])  # Wyjście: https://example.com
                      
                    

3. Używanie atrybutów do filtrowania elementów

Teraz, gdy opanowaliśmy wyszukiwanie według tagów, czas dowiedzieć się, jak filtrować elementy za pomocą atrybutów takich jak id i class. Te atrybuty są jak zakładki w książce, które od razu pokazują, co jest co.

HTML

<div class="article">
    <h2 id="title">Nagłówek</h2>
    <p class="content">To jest tekst artykułu...</p>
    <a href="https://example.com" class="link">Czytaj dalej</a>
</div>
Python

# Znajdujemy element z określonym id
title = soup.find(id="title")
print(title.text)  # Wyjście: Nagłówek

# Znajdujemy wszystkie elementy z klasą "content"
content_paragraphs = soup.find_all(class_="content")
for p in content_paragraphs:
    print(p.text)  # Wyjście: To jest tekst artykułu...

Ważne! Używamy class_ zamiast class — żeby uniknąć konfliktu z zastrzeżonym słowem Python.

4. Praktyka pobierania danych z określonymi warunkami

A teraz czas na praktykę! Wyobraź sobie, że musisz pobrać linki i teksty nagłówków z dużej powtarzającej się tablicy artykułów w HTML. Oto przykład danych i jak z nimi pracować:

HTML

<div class="articles">
    <div class="article">
        <h2 class="title">Pierwszy artykuł</h2>
        <a href="https://example.com/1" class="read-more">Czytaj dalej</a>
    </div>
    <div class="article">
        <h2 class="title">Drugi artykuł</h2>
        <a href="https://example.com/2" class="read-more">Czytaj dalej</a>
    </div>
</div>

I oto jak możemy pobrać nagłówki i linki:

Python

html_doc = """<div class="articles">
                <div class="article">
                    <h2 class="title">Pierwszy artykuł</h2>
                    <a href="https://example.com/1" class="read-more">Czytaj dalej</a>
                </div>
                <div class="article">
                    <h2 class="title">Drugi artykuł</h2>
                    <a href="https://example.com/2" class="read-more">Czytaj dalej</a>
                </div>
              </div>"""

soup = BeautifulSoup(html_doc, 'html.parser')

articles = soup.find_all('div', class_='article')
for article in articles:
    title = article.find('h2', class_='title').text
    link = article.find('a', class_='read-more')['href']
    print(f"Nagłówek: {title}, Link: {link}")
    
# Wyjście:
# Nagłówek: Pierwszy artykuł, Link: https://example.com/1
# Nagłówek: Drugi artykuł, Link: https://example.com/2

5. O pułapkach

Teraz, kiedy masz już wiedzę, spójrzmy na kilka typowych błędów. Jednym z najczęstszych problemów jest próba dostępu do atrybutu, który nie istnieje. Na to Python odpowiada przyjaznym, ale jednak nieprzyjemnym KeyError. Aby tego uniknąć, możesz używać metody .get() do pobierania atrybutów z domyślną wartością, jeśli są nieobecne.

Poza tym, pamiętaj o elementach HTML, które mogą być zagnieżdżone i mieć skomplikowaną strukturę. Użyj narzędzia do podglądu kodu źródłowego strony w przeglądarce, aby upewnić się, że poprawnie rozumiesz strukturę, zanim spróbujesz pobrać dane za pomocą BeautifulSoup.

Kolejnym przystankiem w naszej ekscytującej podróży będzie zastosowanie selektorów CSS, aby jeszcze precyzyjniej celować i pobierać informacje. Więc zostań z nami, bo przygody w świecie BeautifulSoup dopiero się zaczynają!

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