【问题标题】:Extract value with XPath, etree and python使用 XPath、etree 和 python 提取值
【发布时间】:2013-03-25 20:05:19
【问题描述】:

我尝试使用 XPath、Python 和 etree 提取值。我对收到的 .xml 文件没有任何影响,我认为它似乎在某种程度上无效。

我的方法已经提取了我要检查的文本节点对象。

# This is the tag.
textTag = lastExportTree.xpath("//TEXT_NODE[@PROPERTY = '%s']/TEXT[@ID = '%s']" % (key, id[1]))

# This is a part of the xml. I already have the text node I want to examine.
<TEXT ID="1001" STATE="5" LOCKED="false"><SYSTEMMESSAGE>CALBUY</SYSTEMMESSAGE>Hiho</TEXT>
<TEXT ID="1002" STATE="1" LOCKED="false"/>
<TEXT ID="1003" STATE="5" LOCKED="false">Stack</TEXT>
<TEXT ID="1004" STATE="1" LOCKED="false">Overflow</TEXT>

如果我想访问 ID="1003" 的内容,我只需要输入:

print(textTag.text); # Will print 'Stack'

但 ID="1001" 的标签也包含 SYSTEMMESSAGE 标签。 如何访问内容“HiHo”? (textTag.text 不起作用!)这是我收到的无效 xml 吗?

非常感谢您的回答!

【问题讨论】:

  • 如果 xml 文件无效,当您尝试加载文档时,您的 xml 解析器会报错,所以这不是问题所在。您显示的 xpath 无效,不会选择您声明的文本节点...更准确的代码会有所帮助!
  • 你看过 etree 文档中关于混合内容的部分吗?effbot.org/zone/element-infoset.htm#mixed-content

标签: python xpath lxml elementtree


【解决方案1】:

我以前也遇到过这个问题,这就是我们最终解决的问题。在我们的例子中,我们感兴趣的是在一个元素的所有非脚本和非样式子元素中查找文本。

# Just to pre-compile our XPath. This will get all the text from this element from
# each of the child elements that aren't 'script' or 'style'
textXpath = etree.XPath(
    '(.|.//*[not(name()="script")][not(name()="style")])/text()')

# If instead you don't want to include the current element:
# textXpath = etree.XPath(
#   './/*[not(name()="script")][not(name()="style")]/text()')

results = ''.join(textXpath(textTag))

它可能不是最漂亮的代码块,但它是我们所采用的。

【讨论】:

  • @dan.lecocq - xpath 与评论不太匹配。它包括当前元素和所有后代(不仅仅是子元素)。
【解决方案2】:

假设您正在向我们展示 lastExportTree 下的节点,应该这样做:

lastExportTree.xpath('TEXT[@STATE="5" and @LOCKED="false" and SYSTEMMESSAGE]/text()')[0]

这表示要查找所有名为 TEXT 且具有给定 STATE 和 LOCKED 属性以及 SYSTEMMESSAGE 子元素的子节点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多