如何在 Nokogiri 中进行正则表达式搜索以匹配特定开头的文本?

发布于 2024-08-07 10:10:25 字数 752 浏览 9 评论 0原文

鉴于:

require 'rubygems'
require 'nokogiri'
value = Nokogiri::HTML.parse(<<-HTML_END)
"<html>
<body>
  <p id='para-1'>A</p>
  <div class='block' id='X1'>
    <h1>Foo</h1>
    <p id='para-2'>B</p>
  </div>
  <p id='para-3'>C</p>
  <h2>Bar</h2>
  <p id='para-4'>D</p>
  <p id='para-5'>E</p>
  <div class='block' id='X2'>
    <p id='para-6'>F</p>
  </div>
</body>
</html>"
HTML_END

我想做一些类似于 Hpricot 中可以做的事情:

divs = value.search('//div[@id^="para-"]')
  1. 如何对 XPath 样式中的元素进行模式搜索?
  2. 我在哪里可以找到可以帮助我的文档?我在 rdocs 中没有看到这一点。

Given:

require 'rubygems'
require 'nokogiri'
value = Nokogiri::HTML.parse(<<-HTML_END)
"<html>
<body>
  <p id='para-1'>A</p>
  <div class='block' id='X1'>
    <h1>Foo</h1>
    <p id='para-2'>B</p>
  </div>
  <p id='para-3'>C</p>
  <h2>Bar</h2>
  <p id='para-4'>D</p>
  <p id='para-5'>E</p>
  <div class='block' id='X2'>
    <p id='para-6'>F</p>
  </div>
</body>
</html>"
HTML_END

I want to do something like what I can do in Hpricot:

divs = value.search('//div[@id^="para-"]')
  1. How do I do a pattern search for elements in XPath style?
  2. Where would I find the documentation to help me? I didn't see this in the rdocs.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

时光礼记 2024-08-14 10:10:25

使用 xpath 函数 starts-with

value.xpath('//p[starts-with(@id, "para-")]').each { |x| puts x['id'] }

Use the xpath function starts-with:

value.xpath('//p[starts-with(@id, "para-")]').each { |x| puts x['id'] }
空宴 2024-08-14 10:10:25
divs = value.css('div[id^="para-"]')
divs = value.css('div[id^="para-"]')
荆棘i 2024-08-14 10:10:25

您正在寻找的一些文档:

And some docs you're seeking:

镜花水月 2024-08-14 10:10:25
Nokogiri::XML::Node.send(:define_method, 'xpath_regex') { |*args|
  xpath = args[0]
  rgxp = /\/([a-z]+)\[@([a-z\-]+)~=\/(.*?)\/\]/
  xpath.gsub!(rgxp) { |s| m = s.match(rgxp); "/#{m[1]}[regex(.,'#{m[2]}','#{m[3]}')]" }
  self.xpath(xpath, Class.new {
    def regex node_set, attr, regex
      node_set.find_all { |node| node[attr] =~ /#{regex}/ }
    end
  }.new)
}

用法:

divs = Nokogiri::HTML(page.root.to_html).
  xpath_regex("//div[@class~=/axtarget$/]//div[@class~=/^carbo/]")
Nokogiri::XML::Node.send(:define_method, 'xpath_regex') { |*args|
  xpath = args[0]
  rgxp = /\/([a-z]+)\[@([a-z\-]+)~=\/(.*?)\/\]/
  xpath.gsub!(rgxp) { |s| m = s.match(rgxp); "/#{m[1]}[regex(.,'#{m[2]}','#{m[3]}')]" }
  self.xpath(xpath, Class.new {
    def regex node_set, attr, regex
      node_set.find_all { |node| node[attr] =~ /#{regex}/ }
    end
  }.new)
}

Usage:

divs = Nokogiri::HTML(page.root.to_html).
  xpath_regex("//div[@class~=/axtarget$/]//div[@class~=/^carbo/]")
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文