为什么这个Xpath无法正常工作?

时间:2017-10-02 08:59:24

标签: parsing xpath web-scraping html-parsing

例如这个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>,它会起作用,为什么会这样?

3 个答案:

答案 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")]