如何通过匹配文本来选择节点
Posted
技术标签:
【中文标题】如何通过匹配文本来选择节点【英文标题】:How to select nodes by matching text 【发布时间】:2010-12-01 06:35:17 【问题描述】:如果我有一堆元素,例如:
<p>A paragraph <ul><li>Item 1</li><li>Apple</li><li>Orange</li></ul></p>
Nokogiri 中是否有内置方法可以获取所有包含文本“Apple”的p
元素? (例如,上面的示例元素会匹配)。
【问题讨论】:
【参考方案1】:Nokogiri 可以(现在)使用 jQuery 扩展 CSS 来做到这一点:
require 'nokogiri'
html = '
<html>
<body>
<p>foo</p>
<p>bar</p>
</body>
</html>
'
doc = Nokogiri::HTML(html)
doc.at('p:contains("bar")').text.strip
=> "bar"
【讨论】:
如果您将 bar 替换为另一个文本,例如:"google encrypted \"google drive\" this year" 它会产生错误,任何想法如何正确转义 " 字符? 尝试使用&quot;
代替嵌入的引号?
有没有办法在不知道什么类型的元素包含文本的情况下做到这一点?如果我执行doc.at(':contains("bar")')
(即没有指定p
元素),那么我会得到整个文档。
没关系,我找到了答案doc.at(':contains("foo"):not(:has(:contains("foo")))')
这里makandracards.com/makandra/…【参考方案2】:
这是一个有效的 XPath:
require 'nokogiri'
doc = Nokogiri::HTML(DATA)
p doc.xpath('//li[contains(text(), "Apple")]')
__END__
<p>A paragraph <ul><li>Item 1</li><li>Apple</li><li>Orange</li></ul></p>
【讨论】:
我更喜欢这个,因为它返回匹配节点的所有实例,而接受的答案只返回 1 个节点。【参考方案3】:尝试使用这个 XPath:
p = doc.xpath('//p[//*[contains(text(), "Apple")]]')
【讨论】:
【参考方案4】:您也可以使用Nikkou 轻松做到这一点:
doc.search('p').text_includes('bar')
【讨论】:
嘿,谢谢你推荐 nikkou,我觉得这会节省我很多时间 :)以上是关于如何通过匹配文本来选择节点的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 XSLT1 在链接的 XML 数据库中定位匹配节点文本?
如何通过设置 Text 属性来强制匹配 Combobox RowSource 行?
Selenium web 自动化使用 python:如何使用 selenium 处理表以通过匹配文本来查找特定行并删除该行