0

Nokogiriでスクレーパーを書いていますが、大きなHTMLファイルをスクレイプしたいと思います。

現在、私は大きなテーブルをこすっています。ここに小さな断片があります:

<table id="rptBidTypes__ctl0_dgResults">
    <tr>
      <td align="left">S24327</td>

      <td>
        Airfield Lighting

        <div>
          <div>
          <table cellpadding="5px" border="2" cellspacing="1px" width="100%" bgcolor=
          "black">
              <tr>
                <td bgcolor="white">Abstract:<br />
                This project is for the purchase and delivery, of various airfield
                lighting, for a period of 36 months, with two optional 1 year renewals,
                in accordance with the specifications, terms and conditions specified in
                the solicitation.</td>
              </tr>
            </table>
          </div>
        </div>
      </td>
    </tr>
</table>

そして、これが私がスクレイプするために使用しているRubyコードです:

document = doc.search("table#rptBidTypes__ctl0_dgResults tr")
  document[1..-1].each do |v|
   cells = v.search 'td'
   if cells.inner_html.length > 0

     data = {
       number: cells[0].text,

     }
    end
    ScraperWiki::save_sqlite(['number'], data)
  end

残念ながら、これは私にはうまくいきません。抽出したいだけですがS24327、すべてのテーブルセルのコンテンツを取得しています。最初のコンテンツのみを抽出するにはどうすればよいtdですか?

このテーブルの下には、同じ形式に従う多くのテーブル行があることに注意してください。

4

3 に答える 3

1

問題は、検索が2つの異なるものに一致することです<tr>。idを持つテーブル内に直接ネストされrptBidTypes__ctl0_dgResultsたタグと、その親テーブル<tr>にネストされたテーブル内のタグです。ループするときは、実際には最初のタグではなく2番目のタグを選択しています。document[1..-1]<tr>

直接の子<tr>タグのみを選択するには、次を使用します。

document = doc.search("table#rptBidTypes__ctl0_dgResults > tr")

<td>次に、次のタグのテキストを取得できます。

document.css('td')[0].text   #=> "S24327"
于 2012-09-10T00:38:47.043 に答える
1

最初のtdの内容は次のようになります。

doc.at("table#rptBidTypes__ctl0_dgResults td").text
于 2012-09-10T00:39:09.477 に答える
1

CSSでは、ネストされたテーブルを含む、テーブルの下の任意の場所をtable tr意味します。trただし、はの直接の子である必要があることtable > trを意味します。trtable

また、セルの値のみが必要なように見えるため、繰り返す必要はありません。これにより、そのようなすべてのセル(各行の最初)が得られます。

doc.search("table#rptBidTypes__ctl0_dgResults > tr > td[1]").map(&:text)
于 2012-09-12T00:07:21.740 に答える