使用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
答案 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")