python - 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')
谢谢。
解决方案
尝试使用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
推荐阅读
- spring-kafka - 如何在 Spring Cloud Stream 中获取自动生成的 KafkaTemplate?
- node.js - Redux-Persist:TypeError:无法读取未定义的属性“getItem”
- identityserver4 - IdentityServer4:混合流下的“需要代码质询”
- regex - 正则表达式检测cuits - Python
- php - 加速正在使用的 jQuery-ajax 自定义过滤器并立即显示结果
- python - 如何实现 ResNet 200D Keras Tensorflow
- sql-server - vb.net 在不安装 SQL Server 的情况下连接到 MDF 文件
- javascript - 在NodeList中查找html div的位置
- python - 追加二维数组的最佳方法
- javascript - 清除过滤器功能不起作用Vue