Ruby 用于搜索通用文本的XPath语法?

Ruby 用于搜索通用文本的XPath语法?,ruby,parsing,xpath,nokogiri,Ruby,Parsing,Xpath,Nokogiri,我有一个使用Nokogiri解析的HTML页面,我应该找到每个元素中包含的通用文本。不管它是哪个元素,它都应该与我传递给contains()的文本匹配 目前我能得到的结果非常一般,我不确定我是否正确解释了XPath文档: html = Nokogiri::HTML(page['result']) puts html.xpath("/*[contains(., 'Foobar')]") 我想要的是包含“Foobar”的元素,但是库返回整个页面。我做错了什么?您尝试的XPath返回包含Foobar

我有一个使用Nokogiri解析的HTML页面,我应该找到每个元素中包含的通用文本。不管它是哪个元素,它都应该与我传递给
contains()
的文本匹配

目前我能得到的结果非常一般,我不确定我是否正确解释了XPath文档:

html = Nokogiri::HTML(page['result'])
puts html.xpath("/*[contains(., 'Foobar')]")

我想要的是包含“Foobar”的元素,但是库返回整个页面。我做错了什么?

您尝试的XPath返回包含
Foobar
文本的所有元素,包括上述元素的祖先(因为祖先也被认为包含
Foobar
文本,尽管间接)

您可以通过这种方式仅获取直接包含
Foobar
文本的元素:

puts html.xpath("/*[contains(text(), 'Foobar')]")

使用带有XPath的
/
意味着从文档的根开始,这不是您想要的
xpath
将找到所有匹配的元素,这意味着还将找到包含所需文本的元素的所有祖先节点,从而使根下的所有节点都满足条件

下面是一个示例,说明了这一点:

require 'nokogiri'

xml = '<html><body><div><p>foobar</p></div></body></html>'
doc = Nokogiri::XML(xml)
doc.xpath("/*[contains(., 'foobar')]").map(&:to_html)
# => ["<html><body><div><p>foobar</p></div></body></html>"]
请尝试
/*[包含(child::text(),'Foobar')]
require 'nokogiri'

xml = '<html><body><div><p id="1">foobar</p></div><div><p id="2">foobar</p></div></body></html>'
doc = Nokogiri::XML(xml)
doc.search("//text()[contains(., 'foobar')]").map{ |t| t.parent.to_html }
# => ["<p id=\"1\">foobar</p>", "<p id=\"2\">foobar</p>"]
doc.search("//text()[contains(., 'foobar')]").map{ |t| t.parent.path }
# => ["/html/body/div[1]/p", "/html/body/div[2]/p"]