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