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. 選択した div ごとに、<b>を使用して埋め込みタグを簡単に取得できatます。これにより、最初に見つかった一致する要素が取得され、次にsearch一致する都市の埋め込み div が取得されます。
于 2013-10-27T04:30:11.380 に答える