我正在尝试找到一种将内容直接拉到标头标记下并将其分组到基于标头文本的数组中的方法。
我想我找到了一个与此非常相似的解决方案,但是它不起作用,我想知道这是否是因为我要从中抓取的网站没有将“ li”对象分组为“ ul”标签。
我的代码:
require 'Nokogiri'
require 'open-uri'
BASE_URL = "https://www.hornellanimalshelter.org/donate.html"
doc = Nokogiri::HTML(open(BASE_URL))
cats = doc.search('.box-09_cnt h4')
cats_and_items = cats.map{ |cat|
items = cat.next_element.search('li')
{name: cat.text, items: items.map(&:text)}
}
=> [{:name=>"Toys & Enrichment", :items=>[]}, {:name=>"Office
Supplies", :items=>[]}, {:name=>"Cleaning Supplies", :items=>[]},
{:name=>"Food & Treats", :items=>[]}, {:name=>"Kennel Care", :items=>
[]}, {:name=>"& More!", :items=>[]}]
正如您在上面看到的那样-它不会拉任何锂,但似乎可以通过以下简单操作正常工作:
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<h4>Alabama</h4>
<ul>
<li><a href="//auburn.craigslist.org/">auburn</a></li>
<li><a href="//bham.craigslist.org/">birmingham</a></li>
</ul>
<h4>Alaska</h4>
<ul>
<li><a href="//anchorage.craigslist.org/">anchorage / mat-su</a></li>
<li><a href="//fairbanks.craigslist.org/">fairbanks</a></li>
</ul>
EOT
states = doc.search('h4')
states_and_cities = states.map{ |state|
cities = state.next_element.search('li a')
[state.text, cities.map(&:text)]
}.to_h
states_and_cities
# => {"Alabama"=>["auburn", "birmingham"],
# "Alaska"=>["anchorage / mat-su", "fairbanks"]}
有什么想法吗?提前感谢!
答案 0 :(得分:0)
可能是这样(未经测试):
data = doc.search('h4').map do |h4|
[h4.text, h4.search('+ ul li').map(&:text)]
end
然后获取哈希:
h = Hash[data]