【问题标题】:XPath: select tag with empty valueXPath:选择具有空值的标签
【发布时间】:2012-01-31 01:42:31
【问题描述】:

如何在 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 "-------------------------"

【问题讨论】:

    标签: python xml xpath lxml


    【解决方案1】:

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

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

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

    这个 XPath 表达式

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

    选择 XML 文档中的所有 row 元素,这些元素具有 col 子元素、属性 name 和字符串值 "POW" 并且没有子元素 - 元素并且其字符串值完全由空白字符,或者是空字符串。

    如果“空”理解为“根本没有子节点”,这意味着没有子元素、没有子 PI 节点和没有子注释节点,则使用:

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

    【讨论】:

      【解决方案2】:

      使用这个:

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

      【讨论】:

      • 表达式末尾有不必要的)]... 它选择了我的代码中的所有行(在 XPath Checker 中一切正常)。我更新了我的问题...
      【解决方案3】:
      //row[col[@name='POW' and not(normalize-space())]]
      

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-25
        • 2010-10-17
        • 2015-09-10
        • 1970-01-01
        • 1970-01-01
        • 2011-12-16
        • 2010-10-06
        • 1970-01-01
        相关资源
        最近更新 更多