lxml元素布尔检查

6 投票
3 回答
1269 浏览
提问于 2025-04-18 12:41

这段代码:

from lxml.html import fromstring, tostring

s = '<span class="left">Whatever</span>'
e = fromstring(s)
print(tostring(e))
print(bool(e))

输出结果是:

<span class="left">Whatever</span>
False

为什么会这样?这个类里的布尔检查是怎么工作的?能给我指个相关的文档或代码吗?

附言
我使用的是 lxml 3.3.5 版本

3 个回答

0

这是我用你的代码得到的结果...

>>> print(bool(e))
__main__:1: FutureWarning: The behavior of this method will change in future ve
sions. Use specific 'len(elem)' or 'elem is not None' test instead.
False
>>> e
<Element span at 0x2db85a0>
>>>

看起来很明显,他们重写了 __bool__ 这个方法,并告诉你应该怎么检查它...

4

XML和HTML在Python的原生数据结构中并不能很好地对应。也就是说,没有一个明确的方法来判断一个元素对象应该被视为真(True)还是假(False)。

如果你想知道是否成功获取了一个元素,可以把它和None进行比较。例如:

element is None

如果你想知道你的元素是否有任何子节点,可以使用len。例如:

len(element) > 0
7

在Python文档中相关的地方是:https://docs.python.org/2/library/stdtypes.html#truth-value-testing

一个对象的“真值”是通过它的 __nonzero__() 方法来判断的。如果这个方法不存在,就会用 __len__() 方法的结果来判断。因为你的元素没有任何子元素,也就是说它的长度是0,所以它被认为是 False,也就是“假”。

撰写回答