Проверять атрибуты в BeautifulSoup? - PullRequest
14 голосов
/ 10 августа 2011

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

например.,

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

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

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

if "name" in n:

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

EDIT

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

n.get("class")

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

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

Ответы [ 4 ]

14 голосов
/ 29 апреля 2012

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

n.get("class")

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

n.has_attr("class")
6 голосов
/ 10 августа 2011

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

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
1 голос
/ 20 апреля 2013

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

if class in n.attrs

0 голосов
/ 10 августа 2011

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

if hasattr(n,"name"):
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...