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,aitp. - 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,pitd.) 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ść
Truejest 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ż
limitelementó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