1. Dlaczego warto używać find
i find_all
?
Dzisiaj porozmawiamy o dwóch podstawowych metodach, które pozwolą nam efektywnie i celowo wyciągać elementy z dokumentów HTML: find
i find_all
.
Zanim przejdziemy do kodu, zastanówmy się, po co właściwie potrzebujemy tych metod. Wyobraź sobie stronę internetową jako ogromną bibliotekę, gdzie każde słowo i zdanie to elementy HTML. Może się wydawać, że znalezienie potrzebnej informacji jest jak zgadywanie smaku lodów, nie znając ich koloru. Metody find
i find_all
są twoimi „detektorami smaku”, które pomogą ci dokładnie dostroić się do potrzebnych informacji.
find
: Ta metoda jest jak nawyk programisty, by rano szukać pierwszej filiżanki kawy - szybko znajduje i zwraca pierwszy element spełniający określone kryteria.find_all
: To bardziej cierpliwe i dogłębne podejście, zwraca listę wszystkich elementów, które spełniają kryteria wyszukiwania. Idealne w sytuacjach, gdy potrzebujesz więcej informacji (na przykład jak kilka filiżanek kawy w ciągu dnia).
2. Użycie find
Tak więc metoda find
może być używana, gdy potrzebujesz szybko wyciągnąć pierwszy pasujący element. Przyjmuje różne parametry, takie jak nazwa taga, atrybuty, a nawet funkcje.
Sygnatura metody find
find(name=None, attrs={}, recursive=True, string=None, **kwargs)
Parametry metody find
- name: Nazwa taga, który chcesz znaleźć. Może to być dowolny tag HTML, na przykład
div
,p
,h1
,a
itp. - attrs: Słownik atrybutów taga. Na przykład
{'class': 'example'}
lub{'id': 'main'}
. Ten parametr pozwala zawęzić wyszukiwanie. - recursive: Boolowski parametr, który określa, czy metoda ma szukać taga na wszystkich poziomach zagnieżdżenia. Domyślnie
True
, co oznacza, że wyszukiwanie zostanie przeprowadzone na wszystkich poziomach. - string: Wyszukiwanie elementów z określonym tekstem. Przydatne do filtrowania elementów na podstawie ich zawartości tekstowej.
- kwargs: Dodatkowe argumenty do wyszukiwania po atrybutach. Jeśli podano argumenty takie jak
class_
, będą one interpretowane jakoattrs={'class': 'value'}
.
Przykład
from bs4 import BeautifulSoup
html_doc = """
<html>
<head><title>Opowieść Dormouse'a</title></head>
<body>
<p class="title"><b>Opowieść Dormouse'a</b></p>
<p class="story">Dawno, dawno temu były sobie trzy małe siostry; i miały na imię
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> oraz
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
i mieszkały na dnie studni.</p>
</body>
</html>
"""
soup = BeautifulSoup(html_doc, 'html.parser')
first_link = soup.find('a') # Znajdujemy pierwszy <a> tag
print(first_link) # Wyświetla: <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>
Jak widzisz, metoda find
znalazła pierwszy tag <a>
w dokumencie i możemy spokojnie kontynuować swoje poszukiwania, wiedząc, że potrzebna informacja została znaleziona.
3. Użycie find_all
Metoda find_all
zwraca listę wszystkich elementów, które spełniają określone kryteria. Jest to szczególnie przydatne, gdy trzeba znaleźć wszystkie tagi określonego typu lub wszystkie elementy z określoną klasą.
Sygnatura metody find_all
find_all(name=None, attrs={}, recursive=True, string=None, limit=None, **kwargs)
Parametry metody find_all
- name: Nazwa taga, który chcesz znaleźć. Może być to ciąg z nazwą taga (
div
,a
,p
itd.) lub lista tagów, np.["div", "p"]
. - attrs: Słownik atrybutów do filtrowania tagów, np.
{'class': 'example'}
. - recursive: Określa, czy wyszukiwanie zostanie przeprowadzone rekurencyjnie, obejmując zagnieżdżone tagi. Wartość
True
jest domyślna. - string: Szuka tagów zawierających wskazany tekst.
- limit: Ustawia maksymalną liczbę zwróconych wyników. Jeśli ustawione, metoda zwróci nie więcej niż
limit
elementów. - kwargs: Dodatkowe parametry do filtrowania atrybutów taga.
Przykład użycia find_all
Jeśli find
to jak szybkie wyszukiwanie potrzebnej książki na półce, to find_all
to bardziej szczegółowe podejście, jakbyś przeglądał każdy nagłówek, żeby się upewnić.
all_links = soup.find_all('a') # Znajdujemy wszystkie <a> tagi
for link in all_links:
print(link.get('href')) # Wyświetla linki: http://example.com/elsie, http://example.com/lacie, http://example.com/tillie
W tym przykładzie znajdujemy wszystkie tagi <a>
, a następnie pobieramy linki z każdego z nich. Jest to przydatne, gdy musisz zebrać wszystkie linki na stronie.
Ważne! Metody find()
i find_all()
można wywoływać nie tylko na obiekcie soup, ale również na dowolnym elemencie potomnym, który został zwrócony funkcjami find()
, select()
itp.
GO TO FULL VERSION