soup.find()

soup.find() – метод, который ищет первый элемент по указанным критериям. По умолчанию поиск осуществляется по всему дереву элементов, если элемент не найден, возвращается None.

Общий синтаксис:

soup.find(name, attrs={}, recursive=True, string, **kwargs)

Для более точного поиска можно использовать различные параметры

name(‘div’) – имя тега элемента, который необходимо найти. Можно использовать строку или регулярные выражения для более гибкого поиска.

attrs – указывается словарь атрибутов элемента для поиска.

recursive – булевое значение, по умолчанию True. Если установить в False, поиск осуществляется только в первых дочерних элементах, в противном случае – анализируются все вложенные элементы.

string – строка, которую необходимо найти.

Далее будут примеры реализации

Поиск по ID:

# Здесь 'tag' - это имя тега, а 'your_id' - значение атрибута id.
soup.find('tag', id='your_id')

Поиск по классу:

# используется class_, так как class является зарезервированным словом в Python.
soup.find('tag', class_='your_class')

Поиск через пользовательский атрибут:

# Здесь 'data-attribute' - это имя пользовательского атрибута, а 'value' - его значение.
soup.find('tag', {'data-attribute': 'value'})

Поиск по двойному пользовательскому атрибуту:

# у тега одновременно должны присутствовать два атрибута с указанными  значениями.
soup.find('tag', {'data-attribute1': 'value1', 'data-attribute2': 'value2'})

Двойной класс:

# Указываются оба класса, разделенные пробелом.
soup.find('tag', class_='class1 class2')

Поиск по динамическому классу:

# нередко класс формируется динамически, можно выделить только основу, что позволяет использовать регулярные выражения

import re
soup.find('tag', class_=re.compile('your_dynamic_part'))

Привязка к динамическому пользовательскому атрибуту:

soup.find('tag', {'data-attribute': re.compile('dynamic_part')})

Для поиска по тегу без атрибутов достаточно указать имя тега:

soup.find('tag')

Пример. Код осуществляет поиск первого тега тега <h1>, также ищется первый тег <p> с классом ‘info’.

soup.find('h1')
#и
soup.find('p', {'class': 'info'})
from bs4 import BeautifulSoup

html_doc = """
<html>
    <head>
        <title>Example Page</title>
    </head>
    <body>
        <h1>Hello World</h1>
        <p class="info">This is a paragraph.</p>
        <p class="info">This is another paragraph.</p>
    </body>
</html>

"""

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

# Найдёт первый тег h1
first_h1 = soup.find('h1')
print(first_h1)
print('----разделитель----')

# Найдёт первый тег p с классом "info"
first_p = soup.find('p', {'class': 'info'})
print(first_p)

Вывод:

<h1>Hello World</h1>
----разделитель----
<p class="info">This is a paragraph.</p>

В следующем примере при помощи метода find() осуществляется поиск первого тега <div>, у которого есть атрибут id=’main’.

main_div = soup.find('div', {'id': 'main'})

Внутри найденного <div> дополнительно используется метод find() для поиска первых первого тега <h1>.

main_h1 = main_div.find('h1')

Далее запускается поиск тега <p>, у которого есть класс ‘info’.

main_p = main_div.find('p', {'class': 'info'})

Обнаруженные теги выводятся в консоль. Код полностью:

from bs4 import BeautifulSoup

html_doc = """
<html>
    <head>
        <title>Example Page</title>
    </head>
    <body>
        <div id="main">
            <h1>Hello World</h1>
            <p class="info">This is a paragraph.</p>
            <p class="info">This is another paragraph.</p>
            <ul>
                <li>Item 1</li>
                <li>Item 2</li>
                <li>Item 3</li>
            </ul>
        </div>
        <div id="secondary">
            <p>Some additional information.</p>
        </div>
    </body>
</html>

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

# Находим первый div с id "main"
main_div = soup.find('div', {'id': 'main'})
print(main_div)
print('----разделитель----')

# Найдите первый тег h1 внутри «основного» div
main_h1 = main_div.find('h1')
print(main_h1)
print('----разделитель----')

# Найдите первый тег p с классом «информация» внутри «основного» div
main_p = main_div.find('p', {'class': 'info'})
print(main_p)
print('----разделитель----')

# Найдите первый тег ul внутри «основного» div
main_ul = main_div.find('ul')
print(main_ul)

Пример 3. Использование attr

Находится первый <div> с идентификатором main

main_div = soup.find('div', attrs={'id': 'main'})

Также находится первый тег <p> с указанным классом, после чего выводится результат.

info_p = soup.find('p', attrs={'class': 'info'})
from bs4 import BeautifulSoup

html_doc = """
<html>
    <head>
        <title>Example Page</title>
    </head>
    <body>
        <div id="main">
            <h1>Hello World</h1>
            <p class="info">This is a paragraph.</p>
            <p class="info">This is another paragraph.</p>
            <ul>
                <li>Item 1</li>
                <li>Item 2</li>
                <li>Item 3</li>
            </ul>
        </div>
        <div id="secondary">
            <p>Some additional information.</p>
        </div>
    </body>
</html>

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

# Найдите первый div с идентификатором «main»
main_div = soup.find('div', attrs={'id': 'main'})
print(main_div)
print('----разделитель----')

# Найдите первый тег p с классом "info"
info_p = soup.find('p', attrs={'class': 'info'})
print(info_p)

Вывод:

<div id="main">
<h1>Hello World</h1>
<p class="info">This is a paragraph.</p>
<p class="info">This is another paragraph.</p>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
</div>
----разделитель----
<p class="info">This is a paragraph.</p>
Process finished with exit code 0


Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: