首页 > 解决方案 > lxml xpath 表达式,用于选择给定子节点下的所有文本,包括他的子节点

问题描述

假设我有如下 XML:

<node1>
    <text title='book'>
       <div chapter='0'>
          <div id='theNode'>
              <p xml:id="40">
               A House that has:
                   <p xml:id="45">- a window;</p>
                   <p xml:id="46">- a door</p>
                   <p xml:id="46">- a door</p>
               its a beuatiful house
               </p>
          </div>
       </div>
    </text>
</node1>

我想找到文本标题并从出现在文本标题书节点内的第一个 p 标记中获取所有文本

到目前为止我知道:

from lxml import etree
XML_tree = etree.fromstring(XML_content,parser=parser)
text = XML_tree.xpath('//text[@title="book"]/div/div/p/text()') 

得到:“拥有的房子就是漂亮的房子”

但我也想要第一个的所有可能的孩子和伟大的孩子的所有文本

出现在

基本上; 寻找然后寻找第一个

无论嵌套如何,都给我那个 p 标签下的所有文本。

伪代码:

text = XML_tree.xpath('//text[@title="book"]/... any number of nodes.../p/ ....all text under p') 

谢谢。

标签: pythonxmlxpathlxmlchildren

解决方案


尝试使用string()normalize-space()...

from lxml import etree

XML_content = """
<node1>
    <text title='book'>
       <div chapter='0'>
          <div id='theNode'>
              <p xml:id="x40">
               A House that has:
                   <p xml:id="x45">- a window;</p>
                   <p xml:id="x46">- a door</p>
                   <p xml:id="x47">- a door</p>
               its a beuatiful house
               </p>
          </div>
       </div>
    </text>
</node1>
"""

XML_tree = etree.fromstring(XML_content)
text = XML_tree.xpath('string(//text[@title="book"]/div/div/p)')
# text = XML_tree.xpath('normalize-space(//text[@title="book"]/div/div/p)')
print(text)

输出使用string()...


               A House that has:
                   - a window;
                   - a door
                   - a door
               its a beuatiful house

输出使用normalize-space()...

A House that has: - a window; - a door - a door its a beuatiful house

推荐阅读