Parsowanie HTML za pomocą BeautifulSoup
find(), select(), selektory CSS i wyodrębnianie ustrukturyzowanej treści z HTML.
Parsowanie HTML za pomocą BeautifulSoup to bezpłatna lekcja AI Agents na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Agents, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Agents zawiera 4 lekcji w sumie.
Dlaczego agenci analizują HTML?
Wiele źródeł danych nie udostępnia API — są nimi strony internetowe. Gdy agent musi wyodrębnić uporządkowane informacje z HTML, musi przeanalizować surowe znaczniki i przekształcić je w drzewo, po którym można się poruszać.
BeautifulSoup (bs4) to standardowa biblioteka Pythona do tego celu. Przekształca nieuporządkowany HTML w obiekt Pythona, który można z łatwością przeszukiwać.
Tworzenie obiektu BeautifulSoup
Do BeautifulSoup() należy przekazać surowy HTML i nazwę parsera. Parser 'html.parser' jest wbudowany w Pythona i nie wymaga dodatkowej instalacji. Do szybszego analizowania dużych stron można użyć 'lxml', dostępnego za pośrednictwem pip.
from bs4 import BeautifulSoup
import httpx
# Fetch HTML
response = httpx.get('https://example.com', timeout=10.0)
html = response.text
# Parse it
soup = BeautifulSoup(html, 'html.parser')
# Get the page title
print(soup.title.text) # 'Example Domain'find() — znajdowanie pojedynczego elementu
soup.find(tag, attrs) zwraca pierwszy pasujący element albo None, jeśli go nie znaleziono. Można dopasowywać elementy według nazwy znacznika, klasy, identyfikatora lub dowolnego atrybutu.
Zawsze należy sprawdzić, czy wynik nie jest równy None, zanim wywoła się na nim metody.
from bs4 import BeautifulSoup
html = '<div class="content"><h1>Title</h1><p>Body text here.</p></div>'
soup = BeautifulSoup(html, 'html.parser')
# Find by tag + class
content_div = soup.find('div', class_='content')
if content_div:
heading = content_div.find('h1')
print(heading.text) # 'Title'
# Find by id
sidebar = soup.find('div', id='sidebar') # None if absentfind_all() — znajdowanie wielu elementów
soup.find_all(tag) zwraca listę wszystkich pasujących elementów. Należy ją przeiterować, aby wyodrębnić dane z powtarzających się struktur, takich jak elementy listy, wiersze tabeli lub karty artykułów.
from bs4 import BeautifulSoup
html = '<ul><li>Apple</li><li>Banana</li><li>Cherry</li></ul>'
soup = BeautifulSoup(html, 'html.parser')
items = soup.find_all('li')
for item in items:
print(item.text) # Apple, Banana, Cherry
# Limit results
first_two = soup.find_all('li', limit=2)Selektory CSS za pomocą select()
soup.select('css selector') pozwala używać znanej składni CSS. Często jest to bardziej zwięzłe rozwiązanie niż łańcuchowe wywołania find(), szczególnie w przypadku zagnieżdżonych elementów.
from bs4 import BeautifulSoup
html = '''
<table>
<tr><td class="name">Alice</td><td class="score">95</td></tr>
<tr><td class="name">Bob</td><td class="score">87</td></tr>
</table>
'''
soup = BeautifulSoup(html, 'html.parser')
# Select all td elements inside tr inside table
cells = soup.select('table tr td')
for cell in cells:
print(cell.text)
# Select only name cells
names = soup.select('td.name')
for n in names:
print(n.text) # Alice, BobWyodrębnianie tekstu za pomocą .text i .strip()
.text (lub .get_text()) zwraca całą treść tekstową wewnątrz elementu, w tym tekst z zagnieżdżonych znaczników. Należy użyć .strip(), aby usunąć początkowe i końcowe białe znaki, które często występują w HTML.
from bs4 import BeautifulSoup
html = '<p> \n Price: <strong>$29.99</strong> \n </p>'
soup = BeautifulSoup(html, 'html.parser')
paragraph = soup.find('p')
# .text includes nested tag content
print(paragraph.text) # ' \n Price: $29.99 \n '
print(paragraph.text.strip()) # 'Price: $29.99'
# get_text with separator
print(paragraph.get_text(separator=' ', strip=True)) # 'Price: $29.99'Wyodrębnianie atrybutów za pomocą .get()
Atrybuty znaczników, takie jak href, src i data-*, są dostępne jak elementy słownika za pomocą .get('attr_name'). Metoda bezpiecznie zwraca None, jeśli brakuje danego atrybutu.
from bs4 import BeautifulSoup
html = '''
<a href="https://example.com/page" data-id="42">Click here</a>
<img src="/images/logo.png" alt="Logo">
'''
soup = BeautifulSoup(html, 'html.parser')
link = soup.find('a')
print(link.get('href')) # 'https://example.com/page'
print(link.get('data-id')) # '42'
print(link.get('class')) # None (no class attribute)
img = soup.find('img')
print(img.get('src')) # '/images/logo.png'Poruszanie się po drzewie analizy
Elementy BeautifulSoup mają relacje elementu nadrzędnego, podrzędnego i sąsiadującego, po których można się poruszać. Należy użyć .parent, .children, .next_sibling i .previous_sibling, aby poruszać się wokół znalezionego elementu.
from bs4 import BeautifulSoup
html = '''
<div class="article">
<h2>Headline</h2>
<p>First paragraph.</p>
<p>Second paragraph.</p>
</div>
'''
soup = BeautifulSoup(html, 'html.parser')
h2 = soup.find('h2')
print(h2.text) # 'Headline'
print(h2.parent['class']) # ['article']
print(h2.next_sibling.next_sibling.text) # 'First paragraph.'Wyodrębnianie wszystkich linków ze strony
Typowym zadaniem agenta jest zebranie wszystkich linków ze strony w celu dalszego przeszukiwania. Należy znaleźć wszystkie znaczniki <a> i wyodrębnić ich atrybuty href, pomijając puste wartości.
from bs4 import BeautifulSoup
import httpx
def extract_links(url: str) -> list:
response = httpx.get(url, timeout=10.0)
soup = BeautifulSoup(response.text, 'html.parser')
links = []
for tag in soup.find_all('a'):
href = tag.get('href')
if href and href.startswith('http'):
links.append(href)
return links
# urls = extract_links('https://news.ycombinator.com')
# print(urls[:5])Łagodne obsługiwanie niepoprawnego HTML
HTML spotykany w rzeczywistych projektach często zawiera błędy: niezamknięte znaczniki, niepasujące elementy lub problemy z kodowaniem. Parser BeautifulSoup jest wyrozumiały i automatycznie próbuje naprawiać błędy. Mimo to podczas uzyskiwania dostępu do zagnieżdżonych elementów zawsze należy zabezpieczyć się przed wartością None.
from bs4 import BeautifulSoup
# Broken HTML — missing closing tags
html = '<div><p>Hello <strong>World</div>'
soup = BeautifulSoup(html, 'html.parser')
# BS4 repairs the tree automatically
print(soup.prettify())
# <div><p>Hello <strong>World</strong></p></div>
# Safe chained access
price = soup.find('span', class_='price')
price_text = price.text.strip() if price else 'N/A'
print(price_text) # 'N/A'Kompletne narzędzie agenta do skrobania stron
Połączmy wszystko w całość: kompletna funkcja skrobania stron, którą agent może wywołać jako narzędzie. Pobiera stronę, analizuje ją i zwraca uporządkowane dane w formacie, który agent może przetwarzać.
from bs4 import BeautifulSoup
import httpx
def scrape_article(url: str) -> dict:
response = httpx.get(url, headers={'User-Agent': 'MyAgent/1.0'}, timeout=10.0)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
title = soup.find('h1')
paragraphs = soup.find_all('p')
return {
'url': url,
'title': title.text.strip() if title else '',
'text': ' '.join(p.text.strip() for p in paragraphs[:5]),
'links': [a.get('href') for a in soup.find_all('a', href=True)][:10]
}Sprawdzenie wiedzy: BeautifulSoup
Proszę sprawdzić swoją wiedzę na temat analizowania HTML za pomocą BeautifulSoup.
Podsumowanie: analizowanie HTML za pomocą BeautifulSoup
Potrafi już Pan/Pani wyodrębniać ustrukturyzowane dane ze stron HTML w swoich agentach:
- Tworzyć obiekt soup za pomocą
BeautifulSoup(html, 'html.parser') - Używać
find()dla pojedynczego elementu ifind_all()dla wielu elementów - Używać
select()do wykonywania zapytań za pomocą selektorów CSS - Pobierać tekst za pomocą
.text.strip(), a atrybuty za pomocą.get('attr') - Poruszać się po drzewie za pomocą
.parent,.childreni elementów sąsiednich
W połączeniu z klientem HTTP BeautifulSoup umożliwia agentowi odczytywanie dowolnej strony internetowej.
Często zadawane pytania
Czy lekcja „Parsowanie HTML za pomocą BeautifulSoup” jest bezpłatna?
Tak — pełny tekst „Parsowanie HTML za pomocą BeautifulSoup” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Agents, przejdź na CoddyKit PRO. Kurs AI Agents zawiera 4 lekcji w sumie.
Co nauczysz się w „Parsowanie HTML za pomocą BeautifulSoup”?
find(), select(), selektory CSS i wyodrębnianie ustrukturyzowanej treści z HTML. Ćwiczysz AI Agents z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć AI Agents?
Nie wymagamy żadnego doświadczenia. AI Agents w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Parsowanie HTML za pomocą BeautifulSoup”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji AI Agents?
Tak. Każda lekcja AI Agents zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Klienty HTTP dla agentów: httpx i requests
- Parsowanie HTML za pomocą BeautifulSoup
- Obsługa paginacji i treści dynamicznych
- Odpowiedzialne praktyki web scrapingu