CodeGym /Kursy /Python SELF PL /Wyszukiwanie elementów za pomocą metod find i find_all dl...

Wyszukiwanie elementów za pomocą metod find i find_all dla celowego web scrapingu

Python SELF PL
Poziom 32 , Lekcja 1
Dostępny

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 jako attrs={'class': 'value'}.

Przykład

Python

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

Python

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.

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