为什么不检查属性的值意味着该属性存在?

时间:2017-11-30 21:19:57

标签: python beautifulsoup

使用BeautifulSoup时,我经常不得不对标签类的值进行一些操作。例如,假设我希望仅在属性为<p>时对class="box"执行某些操作,否则执行其他操作。 我所做的是:

soup = BeautifulSoup('''
<html><body>
<h1>Titolo</h1>
<p>Testo che sta sotto il titolo</p>
<p class="sidenote">Questo da stampare</p>
<p>Questo è il testo della nota marginale</p>
</body></html>
''',"lxml")

for sel in soup.body:
    if not isinstance(sel,NavigableString) and \
       "class" in sel.attrs and "sidenote" in sel["class"]:
        print(sel)
    else
        print("not found")

这有点笨拙。我想知道是否有办法使条件比这更紧凑。理想情况是检查最终条件(class包含sidenote)意味着该元素确实具有class属性,因此它是一个标记,而不是NavigableString

2 个答案:

答案 0 :(得分:0)

使用三元运算符肯定会删除一些批量,但不是一次性的。 if-else的数量仍然相同。所以,不确定这是否适合你。

http://book.pythontips.com/en/latest/ternary_operators.html

所以当前的代码将成为:

if "class" in div.attrs:
   div.do_something if "box" in div["class"] else div.do_something_else
else:
   div.do_something_else

或者如果你想进一步压缩它(虽然我觉得这会影响可读性):

(div.do_something if "box" in div["class"] else div.do_something_else) if "class" in div.attrs else div.do_something_else

答案 1 :(得分:0)

与Python词典类似,您可以使用get方法,而不是使用[...]访问元素。这样,如果元素不存在但只返回KeyError,则不会引发None。此外,您可以提供默认值,因此您可以将代码简化为:

for sel in soup.body:
    if not isinstance(sel,NavigableString) and \
           "sidenote" in sel.get("class", []):
        print(sel)
    else
        print("not found")