4

サイトから情報を取得するためにnokogiriを使い始めたばかりですが、次のことを行う方法がわかりません。スクレイプしたいHTMLコードがあります。

    <div class="compatible_vehicles">
    <div class="heading">
    <h3>Compatible Vehicles</h3>
    </div><!-- .heading -->
    <ul>
            <li>
        <p class="label">Type1</p>
        <p class="data">All</p>
    </li>
    <li>
        <p class="label">Type2</p>
      <p class="data">All</p>
    </li>
    <li>
        <p class="label">Type3</p>
      <p class="data">All</p>
    </li>
    <li>
        <p class="label">Type4</p>
      <p class="data">All</p>
    </li>
    <li>
        <p class="label">Type5</p>
      <p class="data">All</p>
    </li>
    </ul>
    </div><!-- .compatible_vehicles -->

そして、私はこれで私の画面に必要な出力を得ることができました:

    i = 0
     doc.css('div > .compatible_vehicles > ul > li').each do |item|  
      label = item.at_css(".label").text
      data = item.at_css(".data").text
     print "#{label} - #{data}" + ','
    end  
    i += 1

これにより、次のようなリストが表示されます。画面上のType1-All、Type2-All、Type3-All、Type4-All、Type5-All。

次に、この値を配列で取得して、CSVファイルに保存できるようにします。私はいくつかのことを試しましたが、ほとんどの試みで「文字列を配列に変換できません」というエラーが発生します。誰かがこれで私を助けてくれることを願っています!

4

1 に答える 1

2

HTMLから始める:

html = '
<div class="compatible_vehicles">
    <div class="heading">
        <h3>Compatible Vehicles</h3>
    </div><!-- .heading -->
    <ul>
        <li>
        <p class="label">Type1</p>
        <p class="data">All</p>
        </li>
        <li>
        <p class="label">Type2</p>
        <p class="data">All</p>
        </li>
        <li>
        <p class="label">Type3</p>
        <p class="data">All</p>
        </li>
        <li>
        <p class="label">Type4</p>
        <p class="data">All</p>
        </li>
        <li>
        <p class="label">Type5</p>
        <p class="data">All</p>
        </li>
    </ul>
</div><!-- .compatible_vehicles -->
'

Nokogiriで解析し、タグをループしてタグの内容<li>を取得します。<p>

require 'nokogiri'

doc = Nokogiri::HTML(html)
data = doc.search('.compatible_vehicles li').map{ |li|
  li.search('p').map { |p| p.text }
}

配列の配列を返します。

=> [["Type1", "All"], ["Type2", "All"], ["Type3", "All"], ["Type4", "All"], ["Type5", "All"]]

そこから、それをCSVクラスの例にプラグインして、問題なく動作させることができるはずです。

次に、コードを比較して、画面のフィールドに出力します。

data.map{ |a| a.join(' - ') }.join(', ')
=> "Type1 - All, Type2 - All, Type3 - All, Type4 - All, Type5 - All"

私がしなければならないのはputsそれが正しく印刷されることだけです。

有用なデータ構造を返すことを考えることは非常に重要です。Rubyでは、ハッシュと配列を繰り返し処理してさまざまな形式にマッサージできるため、ハッシュと配列は非常に便利です。配列の配列から、ハッシュを作成するのは簡単です。

Hash[data]
=> {"Type1"=>"All", "Type2"=>"All", "Type3"=>"All", "Type4"=>"All", "Type5"=>"All"}

これにより、ルックアップを非常に簡単に行うことができます。

于 2013-03-27T14:38:07.070 に答える