Nokogiri: поиск Использование XPath
-
19-08-2019
- |
-
-
19-08-2019 - |
Вопрос
я использую Нокогири (Rubygem) Поиск CSS для поиска определенных <div>
Внутри моего HTML. Похоже, что поиск CSS в Nokogiri не любит Regex. Я хотел бы перейти на Нокогири xpath Поиск, так как это, кажется, поддерживает Regex в строках поиска.
Как я могу реализовать (псевдо) поиск CSS, упомянутый ниже в поиске XPath?
require 'rubygems'
require 'nokogiri'
value = Nokogiri::HTML.parse(<<-HTML_END)
"<html>
<body>
<p id='para-1'>A</p>
<p id='para-22'>B</p>
<h1>Bla</h1>
<p id='para-3'>C</p>
<p id='para-4'>D</p>
<div class="foo" id="eq-1_bl-1">
<p id='para-5'>3</p>
</div>
</body>
</html>"
HTML_END
# my_block is given
my_bl = "1"
# my_eq corresponds to this regex
my_eq = "\/[0-9]+\/"
# FIXME The following line should be changed to an xpath search.
if my_div = value.css("div#eq-#{my_eq}_bl-#{my_bl}.foo").first
# doing some stuff with the <p> inside the div
end
Решение
Майк Далессио (половина разработчиков основных разработчиков Nokogiri) дала мне ответ на #nokogiri
(irc.freenode.net). Похоже, что Nokogiri CSS или XPath Search не выполняют соответствующее сопоставление. Это его решение о том, как искать регулярные выражения с Nokogiri:
require 'rubygems'
require 'nokogiri'
value = Nokogiri::HTML.parse(<<-HTML_END)
"<html>
<body>
<p id='para-1'>A</p>
<p id='para-22'>B</p>
<h1>Bla</h1>
<p id='para-3'>C</p>
<p id='para-4'>D</p>
<div class="foo" id="eq-1_bl-1">
<p id='para-5'>3</p>
</div>
<div class="bar" id="eq-1_bl-1">
<p id='para-5'>3</p>
</div>
</body>
</html>"
HTML_END
# my_block is given
my_bl = "1"
# my_eq corresponds to this regex
my_eq = "[0-9]+"
# full regex to search for in node ids
full_regex = %r(eq-#{my_eq}_bl-#{my_bl})
filter_by_id = Class.new do
attr_accessor :matches
def initialize(regex)
@regex = regex
@matches = []
end
def filter(node_set)
@matches += node_set.find_all { |x| x['id'] =~ @regex }
end
end.new(full_regex)
value.css("div.foo:filter()", filter_by_id)
filter_by_id.matches.each do |node|
puts node
end
Другие советы
Более простой подход, основанный на ответе выше:
regex = /subject|header/
headers = doc.css("table td:nth-child(1) div").find_all do
|h| h['class'] =~ regex
end
Спасибо, что разместили этот вопрос.
Не связан с StackOverflow