Ответ 1
Кроме использования метода get()
n.get("class")
Другой вариант - использовать has_attr()
(использовать has_key()
pre BeautifulSoup 4):
n.has_attr("class")
Я разбираю некоторые данные из 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()
Кроме использования метода get()
n.get("class")
Другой вариант - использовать has_attr()
(использовать has_key()
pre BeautifulSoup 4):
n.has_attr("class")
В этом случае исключением может быть ваш друг:
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
Попробуйте это ~:
if class in n.attrs
Почему бы и нет?
if hasattr(n,"name"):