Проверка атрибутов в BeautifulSoup?

Я разбираю некоторые данные из HTML, прогуливаясь по элементам на определенном уровне, используя nextSibling, и делаю разные вещи в зависимости от имени тега и класса каждого встреченного элемента.

например.

if n.name == "p" and n.class == "poem": blah()

Но это вызывает ошибку, если элемент не имеет класса или не является экземпляром тега и, следовательно, не имеет имени.

Тестирование перед доступом к этому

if "name" in n:

всегда возвращает false. Я мог бы проверить тип объекта, возвращаемого nextSibling, чтобы попытаться вытеснить NavigableString и Comment, но это будет более простой способ.

ИЗМЕНИТЬ

Отправил по электронной почте разработчику BeautifulSoup с этим вопросом, и он рекомендовал тестирование с помощью

n.get("class")

который возвращает None, если "класс" не задан, что позволяет просто сделать:

if n.get("class") == "poem": blah()

Ответ 1

Кроме использования метода get()

n.get("class")

Другой вариант - использовать has_attr() (использовать has_key() pre BeautifulSoup 4):

n.has_attr("class")

Ответ 2

В этом случае исключением может быть ваш друг:

try:
    if n.name == 'p' and n['class'] == "poem":
        blah()
except AttributeError: # element does not have .name attribute
    do_something()
except KeyError: # element does not have a class
    do_something_else()

Вы также можете обернуть его в один except, если это так:

try:
    if n.name == 'p' and n['class'] == "poem":
        blah()
except (AttributeError, KeyError):
    pass

Ответ 3

Попробуйте это ~:

if class in n.attrs

Ответ 4

Почему бы и нет?

if hasattr(n,"name"):