我试图将那个HTML文档处理成一个特定的输出,我成功地收到了如下所示的结果:
<div class="country">
<b>Austria</b>
<div>Wolfhard</div>
</div>
<div class="country">
<b>Bulgaria</b>
<div>Nestor</div>
</div>
<div class="country">
<b>Croatia</b>
<div>Sabina</div>
<div>Florencije</div>
</div>
<div class="country">
<b>Czech Republic</b>
<div>Šarlota</div>
<div>Zoe</div>
</div>我想要实现这样的目标:
Austria
Wolfhard
Bulgaria
Nestor
Croatia
Sabina, Florencije
Czech Republic
Šarlota, Zoe名称的最大数量为3。
发布于 2013-10-27 04:30:11
HTML是一个无效的示例。使用有效的最小样本数据是很重要的。
我不在我的电脑附近,但这看起来差不多是对的:
require 'nokogiri'
# encoding: utf8
html = '<html>
<body>
<div class="country">
<b>Austria</b>
<div>Wolfhard</div>
</div>
<div class="country">
<b>Bulgaria</b>
<div>Nestor</div>
</div>
<div class="country">
<b>Croatia</b>
<div>Sabina</div>
<div>Florencije</div>
</div>
<div class="country">
<b>Czech Republic</b>
<div>Šarlota</div>
<div>Zoe</div>
</div>
</body>
</html>'
doc = Nokogiri::HTML(html)建立一个解析的DOM。因为有UTF-8字符,所以如果使用Ruby < v2.0,告诉Ruby这一点很重要,这就是为什么编码行在那里:
# encoding: utf8下面是如何搜索DOM:
countries = doc.search('.country')
data = countries.map { |country|
name = country.at('b').text
cities = country.search('div').map(&:text)
{
:name => name,
:cities => cities
}
}它返回一个散列数组,其中每个散列包含国家名和城市名称的子数组。在那里,您可以轻松地迭代数组,并根据需要输出值。
这一切都很简单,您只需考虑增量步骤:
div的class="country"标记,所以可以使用search或css方法对它们进行迭代。css需要一个CSS选择器,而search则允许CSS或XPath。我通常使用search,因为有时我使用CSS,有时使用XPath,并且在开发代码时可能会在它们之间跳转,因为可能会有更好的流。除了选择器之外,还必须更改方法名是一件痛苦的事。<b>捕获第一个找到的匹配元素,然后为城市获取匹配的嵌入式div的at标记很容易。https://stackoverflow.com/questions/19610982
复制相似问题