我想向下钻取树,并存储所有级别:
search_q = Regex.new("Some search regex here")
#something like: page.search('body').first.children.select {|x| x.text[search_q]}.first.children.select {|x| x.text[search_q]}.first......ad infinitum.
我做了一个黑客攻击:
arbitrarily_long_number = 100
drill = []
(0..arbitrarily_long_number).collect do |n|
begin
drill << eval("page.search('body')"+".first.children.select {|x| x.text[search_q]}" * n)
rescue
break
end
end
问题是这只能通过“第一次”选择进行。有没有办法让它钻进每个节点?我正在考虑某种注射功能,但我仍然没有把头包裹起来。任何帮助将不胜感激。
输出:
pp drill[-4]
puts
pp drill[-3]
puts
pp drill[-2]
#=>[#(Element:0x3fc2324522b4 {
name = "u",
children = [
#(Element:0x3fc232060b60 {
name = "span",
attributes = [
#(Attr:0x3fc2320603e0 {
name = "style",
value = "font-size: large;"
})],
children = [ #(Text "Ingredients:")]
})]
})]
[#(Element:0x3fc232060b60 {
name = "span",
attributes = [
#(Attr:0x3fc2320603e0 { name = "style", value = "font-size: large;" })],
children = [ #(Text "Ingredients:")]
})]
[#(Text "Ingredients:")]
注意: 我正在使用机械化宝石,它利用了Nokogiri。 http://mechanize.rubyforge.org/Mechanize/Page.html#method-i-search http://nokogiri.org/Nokogiri/XML/Node.html#method-i-search
答案 0 :(得分:2)
对我来说,这听起来像你想要遍历:
doc.traverse do |node|
drill << node
end
答案 1 :(得分:1)
你的问题不明确。
如果,通过
我想向下钻取树,并存储所有级别:
你的意思是你想要遍历所有节点,告诉Nokogiri这样做。
require 'nokogiri'
doc = Nokogiri::XML(<<EOT)
<a>
<b>
<c>1</c>
</b>
</a>
EOT
doc.search('*').each do |n|
puts n.name
end
将其粘贴到IRB并抓取输出:
irb(main):011:0* doc.search('*').each do |n|
irb(main):012:1* puts n.name
irb(main):013:1> end
a
b
c
我使用的是XML,而你使用的是HTML,但这并不重要。您必须将doc
更改为page
以适应Mechanize的方式,但这很容易。