例如这个HTML
<div>
<span></span> I want to find this <b>this works ok</b>.
</div>
我想在其中找到一个带有I want to find this
的DIV,然后抓取包含子元素的DIV内的全文
我的XPATH,//*[contains(text(), 'I want to find this')]
根本不起作用。
如果我执行此操作//*[contains(text(), 'this works')]
它有效,但我想根据I want to find this
文字找到任何DIV
但是,如果我从该HTML中删除<span></span>
,它会起作用,为什么会这样?
答案 0 :(得分:2)
text()
只获取第一个内部元素之前的文本。您可以将其替换为.
以使用当前节点进行搜索。
//div[contains(., 'I want to find this')]
这将搜索当前节点内所有文本节点的字符串连接。
要获取所有文本,如果使用lxml,可以使用node.itertext()
迭代所有内部文本:
from lxml import etree
html = """
<div>
<span></span> I want to find this <b>this works ok</b>.
</div>
"""
root = etree.fromstring(html, etree.HTMLParser())
for div in root.xpath('//div[contains(., "I want to find this")]'):
print(''.join([x for x in div.itertext()]))
# => I want to find this this works ok.
答案 1 :(得分:0)
尝试使用// * [text()=&#39;我想找到这个&#39;],这将选择div标签然后对于文本你可以使用getText()方法来获取文本
答案 2 :(得分:0)
您可以尝试Replace text() with string():
//div[contains(string(), " I want to find this")]
Or, you can check that span's following text sibling contains the text:
//div[contains(span/following-sibling::text(), " I want to find this")]