Часто возникает задача парсинга 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’ — в виде списка.
Перейти в телеграм, чтобы получить результаты теста





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