Parsing 为什么这个Xpath不起作用?

Parsing 为什么这个Xpath不起作用?,parsing,xpath,web-scraping,html-parsing,Parsing,Xpath,Web Scraping,Html Parsing,例如,这个HTML <div> <span></span> I want to find this <b>this works ok</b>. </div> 我想找到一个DIV,我想在其中找到它,然后抓取该DIV中的整个文本,包括子元素 我的XPATH/*[containstext,‘我想找到这个’]根本不起作用 如果我这样做//*[containstext,‘this works’]它可以工作,但我想根据我想找到

例如,这个HTML

<div>
    <span></span> I want to find this <b>this works ok</b>.
</div>
我想找到一个DIV,我想在其中找到它,然后抓取该DIV中的整个文本,包括子元素

我的XPATH/*[containstext,‘我想找到这个’]根本不起作用

如果我这样做//*[containstext,‘this works’]它可以工作,但我想根据我想找到的文本查找任何DIV


但是,如果我从该HTML中删除,它会工作,这是为什么?

尝试使用//*[text='I want to find this'],这将选择div标记,然后对于text,您可以使用getText方法获取文本

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.
您可以尝试用字符串替换文本:


这检查确切的文本,我想检查一个DIV是否包含该文本,因为在我的例子中,可能有一个像我一样的长字符串,我也想找到这个bla-bla,在这种情况下,您的答案将不起作用警告:文本只获取第一个文本节点不是很正确。相反,在XPath 1.0下,contains函数忽略所提供参数中除第一个节点外的所有节点。在XPath2.0下,如果第一个参数是包含多个项的列表,则contains函数将抛出错误。但是这个解决方案对所有XPath版本都是正确的,请注意一般原则:95%的人在写文本时,他们都应该在写。改为。更新标题作为此Xpath不工作的原因?一点信息都没有。还要注意/*[containstext,‘this works’]实际上不起作用。它只能返回b,但不可能返回@Umair的重复项。如果您想使用css选择器获得解决方案,则此作业有一个解决方案。@Shahin我实际上使用了包含选择器
//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")]