使用XPath,etree和python提取值

时间:2013-03-25 20:05:19

标签: python xpath lxml elementtree

我尝试使用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吗?

非常感谢您的回答!

2 个答案:

答案 0 :(得分: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))

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

答案 1 :(得分:0)

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

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

这就是找到所有名为TEXT的子节点,它们具有给定的STATE和LOCKED属性以及SYSTEMMESSAGE子元素。