07 Июл 2023
2 мин
1546

Поиск элементов по классу с помощью BeautifulSoup

Часто возникает задача парсинга HTML-страниц с использованием библиотеки BeautifulSoup в Python. Одной из основных задач при парсинге является поиск элементов

Содержание

Часто возникает задача парсинга HTML-страниц с использованием библиотеки BeautifulSoup в Python. Одной из основных задач при парсинге является поиск элементов с определенными атрибутами. Одним из таких атрибутов может быть «class».

Рассмотрим типичную ситуацию на примере:

from bs4 import BeautifulSoup

html = '''
<div class="myclass">Hello</div>
<div class="notmyclass">World</div>
'''

soup = BeautifulSoup(html, 'html.parser')
divs = soup.find_all('div')

for div in divs:
    if div['class'] == 'myclass':
        print(div)

В этом примере мы пытаемся найти все элементы ‘div’ с классом ‘myclass’. Однако, при выполнении этого кода мы получим ошибку KeyError: ‘class’, если у какого-то элемента ‘div’ отсутствует атрибут ‘class’.

Это происходит потому, что библиотека BeautifulSoup возвращает атрибуты элемента в виде словаря и при обращении к несуществующему ключу словаря в Python выбрасывается исключение KeyError.

Для того, чтобы избежать этой ошибки, можно использовать метод get(), который возвращает None, если ключ не найден. Используя этот метод, наш пример будет выглядеть следующим образом:

from bs4 import BeautifulSoup

html = '''
<div class="myclass">Hello</div>
<div class="notmyclass">World</div>
'''

soup = BeautifulSoup(html, 'html.parser')
divs = soup.find_all('div')

for div in divs:
    if div.get('class') == 'myclass':
        print(div)

Теперь, даже если у какого-то элемента ‘div’ отсутствует атрибут ‘class’, код выполнится без ошибок.

Кроме того, стоит отметить, что атрибут ‘class’ возвращается в виде списка, поэтому для корректной проверки на равенство необходимо сравнивать с элементом списка:

from bs4 import BeautifulSoup

html = '''
<div class="myclass">Hello</div>
<div class="notmyclass">World</div>
'''

soup = BeautifulSoup(html, 'html.parser')
divs = soup.find_all('div')

for div in divs:
    if div.get('class') == ['myclass']:
        print(div)

Таким образом, при обработке HTML-элементов с помощью BeautifulSoup не стоит забывать о том, что атрибуты элементов возвращаются в виде словаря, а атрибут ‘class’ — в виде списка.

Содержание

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

Определи профессию по рисунку