您的 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"
对它们进行迭代。需要一个 CSS 选择器,而允许 CSS 或 XPath。我通常使用,因为有时我使用 CSS,有时使用 XPath,并且在我开发代码时可能会在它们之间跳转,因为它们可能会更好地流动。除了选择器之外,还必须更改方法名称是一件很痛苦的事情。search
css
css
search
search
<b>
对于每个选定的 div,使用 抓取嵌入标签很容易at
,它抓取第一个找到的匹配元素,然后search
用于城市的匹配嵌入 div。