当前位置:  开发笔记 > 编程语言 > 正文

如何匹配文本节点,然后使用XPath跟随父节点

如何解决《如何匹配文本节点,然后使用XPath跟随父节点》经验,为你挑选了2个好方法。

我试图用XPath解析一些HTML.按照下面的简化XML示例,我想匹配字符串'Text 1',然后获取相关content节点的内容.


    
        Text 1
        Stuff I want
    

    
        Text 2
        Stuff I don't want
    

我的Python代码抛出一个摇摆不定的:

>>> from lxml import etree
>>>
>>> tree = etree.XML("Text 1Stuff 
I wantText 2Stuff I d
on't want")
>>>
>>> # get all titles
... tree.xpath('//title/text()')
['Text 1', 'Text 2']
>>>
>>> # match 'Text 1'
... tree.xpath('//title/text()="Text 1"')
True
>>>
>>> # Follow parent from selected nodes
... tree.xpath('//title/text()/../..//text()')
['Text 1', 'Stuff I want', 'Text 2', "Stuff I don't want"]
>>>
>>> # Follow parent from selected node
... tree.xpath('//title/text()="Text 1"/../..//text()')
Traceback (most recent call last):
  File "", line 1, in 
  File "lxml.etree.pyx", line 1330, in lxml.etree._Element.xpath (src/
lxml/lxml.etree.c:14542)
  File "xpath.pxi", line 287, in lxml.etree.XPathElementEvaluator.__ca
ll__ (src/lxml/lxml.etree.c:90093)
  File "xpath.pxi", line 209, in lxml.etree._XPathEvaluatorBase._handl
e_result (src/lxml/lxml.etree.c:89446)
  File "xpath.pxi", line 194, in lxml.etree._XPathEvaluatorBase._raise
_eval_error (src/lxml/lxml.etree.c:89281)
lxml.etree.XPathEvalError: Invalid type

这在XPath中可行吗?我是否需要以不同的方式表达我想要做的事情?



1> Johannes Wei..:

你想要那个吗?

//title[text()='Text 1']/../content/text()


你也可以使用// block [title ='Text 1']/content来获取相关的内容节点

2> Dimitre Nova..:

用途:

string(/*/*/title[. = 'Text 1']/following-sibling::content)

与目前公认的JohannesWeiß解决方案相比,这至少代表了两项改进:

    避免使用非常昂贵的缩写"//"(通常导致整个XML文档被扫描),因为无论何时预先知道XML文档的结构,都应该这样做.

    没有返回到父级(避免位置步骤"/ ..")


`/*/*/`做什么?我在一个相当大的文档上尝试它,它看起来像`//`一样慢.
@dentarg:`/*/*`选择所有元素作为文档顶部元素的子元素.它比`// someName`更快,它遍历整个文档并选择名为`"someName"`的每个元素.在这个答案中,我们可以使用更高效的表达式:`string(/*/*/title [.='Text 1'] [1]/following-sibling :: content)`答案中的表达式不应该是效率较低,给定一个优化良好的XPath处理器 - 因为每当`string()`函数提供一个节点集的参数时,它只产生该节点集的第一个节点的字符串值.
推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有