Ruby on rails Mechanize page.search基于相邻标记
我需要抓取一个没有定义很多类的页面,这些类允许我将信息分组在一起 这显示了我正在努力解决的问题:Ruby on rails Mechanize page.search基于相邻标记,ruby-on-rails,web-scraping,mechanize,Ruby On Rails,Web Scraping,Mechanize,我需要抓取一个没有定义很多类的页面,这些类允许我将信息分组在一起 这显示了我正在努力解决的问题: 此产品没有附加任何活动项 ... 第1列 第2列 第3列 第4列 信息1 信息2 信息3 信息4 我的产品标题下没有任何内容,产品标题下有与之相关的数据 我将Rails 4与mongoid一起使用,目标是使用上述数据创建一个哈希,如下所示: {"Product" => "Product 1"} {"Product" => "Product 2", "Col 1" => "
此产品没有附加任何活动项
...
第1列
第2列
第3列
第4列
信息1
信息2
信息3
信息4
我的产品标题下没有任何内容,产品标题下有与之相关的数据
我将Rails 4与mongoid一起使用,目标是使用上述数据创建一个哈希,如下所示:
{"Product" => "Product 1"}
{"Product" => "Product 2", "Col 1" => "Info 1", "Col 2" => "Info 2", "Col 3" => "Info 3"}
我认为CSS相邻同级选择器可以帮助我找到正确的标题,但它只返回第二个标记。如果我使用
page.search("h2.header + p")
它只会给我
标签,我也想从h2.header
中了解产品
是否有一种方法可以在同一级别上为我提供下一个标记?通过这种方式,我可以使用
page.search(“h2.header”)
查找标题,然后检查后面的标签。我想我的问题是,我在谷歌上搜索的是关于Mechanise而不是Nokogiri的问题的答案
我的解决方案的一个非常简化的版本如下:
doc = Nokogiri::HTML(html)
products = Hash.new
products["Products"] = {}
headers = Array.new
tmp_prods = Hash.new
h2 = doc.xpath('//h2[@class="header"]').reject {|i| i.next.name == "p"}
h2.map do |e|
products["Products"][e.text] = {}
e.next.next.next.xpath('./tbody/tr/th').map {|th| headers.push( th.text.strip ) }
e.next.next.next.xpath('./tbody/tr/td').map.with_index {|td, index| tmp_prods[headers[index]] = td.text.strip }
products["Products"][e.text].merge!(tmp_prods)
end
我以散列结束:
产品
=>{“产品”=>{“产品2”=>{“列1”=>“信息1”,“列2”=>“信息2”,“列3”=>“信息3”,“列4”=>“信息4”}}
Nokogiri的文档解释了这一切,特别是“”文档。是的,谢谢。不久前,我在Nokogiri文档中发现了这一点以及更多。看完这些之后,我的问题似乎有点傻。我会发布一个简单的答案。