gpt4 book ai didi

python - 如何使用 Python 在多行文本中搜索 XPath 中的内容?

转载 作者:太空宇宙 更新时间:2023-11-03 13:50:02 26 4
gpt4 key购买 nike

当我使用 contains 在元素的 text() 中搜索数据是否存在时,它适用于普通数据,但当元素内容中有回车符、新行/标签时则无效。如何使 //td[contains(text(), "")] 在这种情况下工作?谢谢!

XML:

<table>
<tr>
<td>
Hello world <i> how are you? </i>
Have a wonderful day.
Good bye!
</td>
</tr>
<tr>
<td>
Hello NJ <i>, how are you?
Have a wonderful day.</i>
</td>
</tr>
</table>

python :

>>> tdout=open('tdmultiplelines.htm', 'r')
>>> tdouthtml=lh.parse(tdout)
>>> tdout.close()
>>> tdouthtml
<lxml.etree._ElementTree object at 0x2aaae0024368>
>>> tdouthtml.xpath('//td/text()')
['\n Hello world ', '\n Have a wonderful day.\n Good bye!\n ', '\n Hello NJ ', '\n ']
>>> tdouthtml.xpath('//td[contains(text(),"Good bye")]')
[] ##-> But *Good bye* is already in the `td` contents, though as a list.
>>> tdouthtml.xpath('//td[text() = "\n Hello world "]')
[<Element td at 0x2aaae005c410>]

最佳答案

使用:

//td[text()[contains(.,'Good bye')]]

解释:

问题的原因不是文本节点的字符串值是多行字符串——真正的原因是 td 元素有多个文本节点子元素。

在提供的表达式中:

//td[contains(text(),"Good bye")]

传递给函数 contains() 的第一个参数是一个包含多个文本节点的节点集

根据 XPath 1.0 规范(在 XPath 2.0 中,这只会引发类型错误),对需要字符串参数但传递给节点集的函数求值时,仅采用节点集中的第一个节点

在此特定情况下,传递的节点集的第一个文本节点具有字符串值:

 "
Hello world "

因此比较失败并且未选择所需的 td 元素

基于 XSLT 的验证:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>

<xsl:template match="/">
<xsl:copy-of select="//td[text()[contains(.,'Good bye')]]"/>
</xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时:

<table>
<tr>
<td>
Hello world <i> how are you? </i>
Have a wonderful day.
Good bye!
</td>
</tr>
<tr>
<td>
Hello NJ <i>, how are you?
Have a wonderful day.</i>
</td>
</tr>
</table>

计算 XPath 表达式并将所选节点(在本例中只有一个节点)复制到输出:

<td>
Hello world <i> how are you? </i>
Have a wonderful day.
Good bye!
</td>

关于python - 如何使用 Python 在多行文本中搜索 XPath 中的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11106971/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com