XPath:选择空值的标签

时间:2011-12-31 12:53:43

标签: python xml xpath lxml

如何在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 个答案:

答案 0 :(得分:8)

  

如何在XPath 1.0中找到空col name="POW"的所有行?

“empty”有许多可能的定义,并且每个定义都有一个不同的XPath表达式选择“空”元素。

空元素的合理定义是:没有子元素且没有文本节点子元素的元素,或者具有单个文本节点子元素的元素,其字符串值仅包含空格字符。

此XPath表达式

//row[col[@name = 'POW']
                    [not(*)]
                       [not(normalize-space())]
      ]

选择XML文档中具有row子元素的所有col元素,其元素name的字符串值为"POW"且没有子元素 - 元素并且其字符串值完全由空格字符组成,或者是空字符串。

如果“空”你理解“完全没有孩子”,这意味着没有子元素,没有子节点PI节点和子节点注释节点,那么使用:

//row[col[@name = 'POW']
                    [not(node())]
      ]

答案 1 :(得分:3)

//row[col[@name='POW' and not(normalize-space())]]

要确保POW列也没有任何子元素(即使它们不包含任何文本),请添加一个额外的谓词过滤器:

//row[col[@name='POW' and not(normalize-space()) and not(*)]]

答案 2 :(得分:1)

使用此:

//row[col[@name = 'POW' and not(text())]]