Как мне выполнить поиск регулярных выражений в Nokogiri для текста, который соответствует определенному началу?
Дано:
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-"]')
- Как мне выполнить поиск по шаблону элементов в стиле XPath?
- Где я могу найти документацию, чтобы помочь мне? Я не видел этого в документах.
4 ответа
Решение
Используйте функцию xpath starts-with
:
value.xpath('//p[starts-with(@id, "para-")]').each { |x| puts x['id'] }
И некоторые документы, которые вы ищете:
- Нокогири: http://nokogiri.org/
- XPath: http://www.w3.org/TR/xpath20/
- Селекторы CSS3: http://www.w3.org/TR/selectors/
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/]")