我试图根据链接和名称所在组之外的标记组织链接和名称列表。它是这样设置的:
<h4>Volkswagen</h4>
<ul>
<li><a href="http://beetle.cars.com">beetle</a></li>
</ul>
<h4>Chevy</h4>
<ul>
<li><a href="http://volt.cars.com">Volt / Electric</a></li>
</ul>
我需要的是结果最终以以下格式与名称作为链接,但我可以稍后做,如果我能把项目组织得当。
每个汽车品牌可以有多个不同数量的车型。我需要按汽车品牌来组织它们:
Volkswagen
Beetle Link Beetle
Jetta Link Jetta
Chevy
Volt Link Volt / Electric
S10 Link S10
我可以毫无问题地拿到品牌清单。我只是很难将一批模型与每个品牌相关联,因为<h4>
标签没有嵌套,所以我不知道如何将它们与以下<ul>
汽车列表相关联。
我更喜欢直接跳到每辆车,然后返回来提取汽车的品牌:
cars = Hash.new { |h, k| h[k] = [] }
doc.xpath('//ul/li/a').each do |car|
brand = car.at('../../preceding-sibling::h4[1]').text
cars[brand] << {link: car['href'], name: car.text}
end
请注意,哈希是用一个指定默认值为数组的块初始化的。这允许添加哈希(通过<<
),如图所示。XPath ../../preceding-sibling::h4[1]
表示:返回到ul
级别,并返回到前面的第一个h4
。这是这辆车的对应品牌。
{"Volkswagen"=>[
{:link=>"http://beetle.cars.com", :name=>"beetle"}
# others here
],
"Chevy"=>[
{:link=>"http://volt.cars.com", :name=>"Volt / Electric"}
# others here
]
}
我发现这种技术很好很简单,只有一个循环。但并不是每个人都喜欢这种风格。