在标头标签(Ruby)之后获取内容

时间:2018-08-02 18:09:13

标签: ruby css-selectors nokogiri

我正在尝试找到一种将内容直接拉到标头标记下并将其分组到基于标头文本的数组中的方法。

我想我找到了一个与此非常相似的解决方案,但是它不起作用,我想知道这是否是因为我要从中抓取的网站没有将“ 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"]}

有什么想法吗?提前感谢!

1 个答案:

答案 0 :(得分:0)

可能是这样(未经测试):

data = doc.search('h4').map do |h4|
  [h4.text, h4.search('+ ul li').map(&:text)]
end

然后获取哈希:

h = Hash[data]