首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取包含特定文本的所有节点(文本和属性)的有效方法

获取包含特定文本的所有节点(文本和属性)的有效方法
EN

Stack Overflow用户
提问于 2019-11-06 10:44:38
回答 1查看 341关注 0票数 0

我的目标是检索所有包含特定文本的节点。

1-我可以检索包含有折叠请求的文本的节点:

代码语言:javascript
复制
[node for node in root.xpath('//*[contains(.,"Carte de chaleur")]') ]


Out[62]: 
[<Element workbook at 0x1818bc76e88>,
 <Element worksheets at 0x1819b886dc8>,
 <Element worksheet at 0x1819c156488>,
 <Element layout-options at 0x1819c1564c8>,
 <Element title at 0x1818e9509c8>,
 <Element formatted-text at 0x1819c156c48>,
 <Element run at 0x1818e955048>,
 <Element worksheet at 0x1819c156a88>,
 <Element layout-options at 0x1819c156fc8>,
 <Element title at 0x1818e9508c8>,
 <Element formatted-text at 0x1819c1565c8>,
 <Element run at 0x1818e955088>]

但是,当我检查时,我只得到两个包含特定文本的元素。

代码语言:javascript
复制
[node for node in root.xpath('//*[contains(.,"Carte de chaleur")]') if node.text.__contains__("Carte de chaleur")]
Out[66]: [<Element run at 0x1818e955048>, <Element run at 0x1818e955088>]

事实上,当我查找其中一个运行节点的路径时,我会发现所有的“工作簿”、工作表等等.实际上是它们的父节点。

代码语言:javascript
复制
run_node
Out[71]: <Element run at 0x1818e955048>
tree.getpath(run_node)
Out[72]: '/workbook/worksheets/worksheet[3]/layout-options/title/formatted-text/run[1]'

那么,为什么这个xpath查询返回我要查找的节点的所有父节点(实际上只有2个运行节点)?

2-如果希望其属性包含特定文本的节点,则运行以下查询:

代码语言:javascript
复制
root.xpath('//@*[contains(.,"bold")]/..')
Out[86]: 
[<Element format at 0x18199f56948>,
 <Element format at 0x18199f56148>]

(这是逻辑,因为我想要包含特定属性节点的节点,所以我正在寻找这个属性节点的父节点)

奇怪的是,这一请求并没有产生同样的结果:

代码语言:javascript
复制
root.xpath('//*[contains(@*,"bold")]') 

即使对我来说,最后一个意思是:“取根的任何子代元素,其任何属性都包含文本”粗体“(与前面的元素相同)。

3-可以使用变量检索属性包含不同值的节点吗?

对于一个变量,我可以这样做:

代码语言:javascript
复制
root('//*[@name=$var]', var="[Petal_length]") 

但有没有办法做这样的事:

代码语言:javascript
复制
root('//*[@name=$var1]//title[@format=$var2]', var1="[Petal_length]",var2="bold") 

编辑:这是原始文本https://ctxt.io/2/AACATwNVFA。Ps:如果有人知道如何分享一些超过1天的短信,那会对我有帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-06 12:24:31

节点的字符串值是包含在其中的所有文本节点的连接,因此如果一个节点在其字符串值中包含特定的子字符串,那么它的所有祖先也会这样做。

给您的一个问题是,您希望输入返回什么?

代码语言:javascript
复制
<para>Carte <i>de</i> chaleur</para>

您想要返回para元素,还是不返回呢?

如果您对此不被返回感到高兴,那么您本质上是说,所有文本都必须在单个文本节点中找到,所以您可以这样做

代码语言:javascript
复制
//*[text()[contains(.,"Carte de chaleur")]]

如果您确实希望返回段落,那么您的要求是“查找包含文本的最低级别元素,而不包括它们的祖先”,那么您可能需要执行如下操作

代码语言:javascript
复制
//*[contains(.,"Carte de chaleur") and not(*[contains(.,"Carte de chaleur")])]

我还没开始考虑效率.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58728296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档