0

我正在尝试将该 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。

4

1 回答 1

0

您的 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
  }
}

这将返回一个哈希数组,其中每个哈希包含国家名称和城市名称的子数组。从那里您可以轻松地遍历数组并根据需要输出值。

这一切都非常简单,您只需考虑增量步骤:

  1. 因为有多个div带有 的标签,所以可以使用或方法class="country"对它们进行迭代。需要一个 CSS 选择器,而允许 CSS 或 XPath。我通常使用,因为有时我使用 CSS,有时使用 XPath,并且在我开发代码时可能会在它们之间跳转,因为它们可能会更好地流动。除了选择器之外,还必须更改方法名称是一件很痛苦的事情。searchcsscsssearchsearch
  2. <b>对于每个选定的 div,使用 抓取嵌入标签很容易at,它抓取第一个找到的匹配元素,然后search用于城市的匹配嵌入 div。
于 2013-10-27T04:30:11.380 回答