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