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