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

问题是您的搜索匹配两个不同的东西:<tr>直接嵌套在带有 id 的表中rptBidTypes__ctl0_dgResults的标签,以及<tr>嵌套该父表内的表中的标签。当您循环浏览时,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意味着tr必须是 的直接子级table

此外,您似乎只需要单元格值,因此您不需要迭代。这将为您提供所有此类单元格(每行中的第一个):

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