检查BeautifulSoup中的属性?

blo*_*cks 13 python beautifulsoup

我正在使用nextSibling遍历某个级别的元素来解析HTML中的一些数据,并根据遇到的每个元素的标记名称和类来执行不同的操作.

例如,

if n.name == "p" and n.class == "poem": blah()
Run Code Online (Sandbox Code Playgroud)

但是如果元素没有类或者它不是Tag的实例而因此没有名称,则会引发错误.

在访问之前进行测试

if "name" in n:
Run Code Online (Sandbox Code Playgroud)

总是返回假.我可以检查nextSibling返回的对象的类型,试图清除NavigableString和Comment,但必须有一个更简单的方法.

编辑

通过这个问题通过电子邮件发送了BeautifulSoup的开发者,他推荐使用

n.get("class")
Run Code Online (Sandbox Code Playgroud)

如果未设置"class",则返回None,这样就可以:

if n.get("class") == "poem": blah()
Run Code Online (Sandbox Code Playgroud)

Jas*_*sch 15

除了使用get()方法

n.get("class")
Run Code Online (Sandbox Code Playgroud)

另一个选择是使用has_attr()(使用has_key()pre BeautifulSoup 4):

n.has_attr("class")
Run Code Online (Sandbox Code Playgroud)

  • 在BeautifulSoup 4```` n.has_key()````已被弃用,````n.has_attr("class")````是首选 (3认同)

Mic*_*ski 6

在这种情况下,例外可能是你的朋友:

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()
Run Code Online (Sandbox Code Playgroud)

except如果是这样的话你也可以把它包装成一个:

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