lxml元素布尔检查
这段代码:
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
,也就是“假”。