我正在尝试将该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。
您的 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
# 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
}
}
这将返回一个哈希数组,其中每个哈希包含国家/地区名称和城市名称的子数组。从那里,您可以轻松迭代数组并根据需要输出值。
这一切都非常简单,您只需要考虑增量步骤:
- 由于有多个带有
class="country"
的div
标记,因此可以使用search
或css
方法迭代它们。css
需要一个CSS选择器,而search
允许CSS或XPath。我通常使用search
因为有时我使用 CSS,有时使用 XPath,并且在开发代码时可能会在它们之间跳转,因为一个代码可能会更好。除了选择器之外,还必须更改方法名称是一种痛苦。 - 对于每个选定的div,使用
at
可以轻松获取嵌入的<b>
标签,这会抓取找到的第一个匹配元素,然后search
城市匹配的嵌入式div。