XPath: 选择值为空的标签
我该如何在XPath 1.0中找到所有col name="POW"
为空的行呢?
<row>
<col name="WOJ">02</col>
<col name="POW"/>
<col name="GMI"/>
<col name="RODZ"/>
<col name="NAZWA">DOLNOŚLĄSKIE</col>
<col name="NAZDOD">województwo</col>
<col name="STAN_NA">2011-01-01</col>
</row>
我尝试了很多方法。有几次在Firefox的XPath Checker扩展中选择是正确的,但lxml.xpath()
却说这个表达式无效,或者根本没有返回任何行。
我的Python代码:
from lxml import html
f = open('TERC.xml', 'r')
page = html.fromstring(f.read())
for r in page.xpath("//row[col[@name = 'POW' and not(text())]]"):
print r.text_content()
print "-------------------------"
3 个回答
1
使用这个:
//row[col[@name = 'POW' and not(text())]]
4
//row[col[@name='POW' and not(normalize-space())]]
为了确保POW这一列里也没有任何子元素(即使这些子元素里面没有文字),你可以添加一个额外的条件过滤器:
//row[col[@name='POW' and not(normalize-space()) and not(*)]]
12
我怎么用XPath 1.0找到所有空的
col name="POW"
行呢?
关于“空”的定义有很多种,每种定义对应着不同的XPath表达式来选择“空”的元素。
一个合理的“空”元素定义是:一个元素没有子元素,也没有文本节点,或者它有一个文本节点,但这个文本节点的内容只包含空格。
这个XPath表达式:
//row[col[@name = 'POW']
[not(*)]
[not(normalize-space())]
]
会选择XML文档中所有的row
元素,这些元素有一个col
子元素,且这个子元素的属性name
的值是"POW"
,并且没有任何子元素,或者它的内容完全是空格,或者是空字符串。
如果你理解的“空”是“完全没有子元素”,也就是说没有子元素、没有子处理指令节点,也没有子注释节点,那么可以使用:
//row[col[@name = 'POW']
[not(node())]
]