-3

我正在使用类似以下内容来抓取页面的信息:

  def self.parse_products
    product_hash = {}
    product = @data.css('.simGrid')

    product.css('td').each do | product |
      product_asin = product.css('.simImage a img').first.value[/(?<=\/)[A-Z\d]{5,}/]
      product_image_url = product.css('.simProductInfo a').to_s
      product_hash[:product] ||= []
      product_hash[:product] << { :image_url        => product_image_url,
                                  :asin             => product_asin }
    end 

    product_hash
  end

问题是结构是这样的:

<table class="simGrid">
    <tbody>
      <tr class="middle">
        <td>
          <div class="simImage"></div>
        </td>
        <td>
          <div class="simImage"></div>
        </td>
        <td>
          <div class="simImage"></div>
        </td>
      </tr>
      <tr>
        <td>
          <div class="simProductInfo"></div>
        </td>
        <td>
          <div class="simProductInfo"></div>
        </td>
        <td>
          <div class="simProductInfo"></div>
        </td>
      </tr>
      <tr>
        <td>
          <hr class="divider" />
        </td>
        <td>
          <hr class="divider" />
        </td>
        <td>
          <hr class="divider" />
        </td>
      </tr>
      <tr class="middle">
        <td>
          <div class="simImage"></div>
        </td>
        <td>
          <div class="simImage"></div>
        </td>
        <td>
          <div class="simImage"></div>
        </td>
      </tr>
      <tr>
        <td>
          <div class="simProductInfo"></div>
        </td>
        <td>
          <div class="simProductInfo"></div>
        </td>
        <td>
          <div class="simProductInfo"></div>
        </td>
      </tr>
      <tr>
        <td>
          <hr class="divider" />
        </td>
        <td>
          <hr class="divider" />
        </td>
        <td>
          <hr class="divider" />
        </td>
      </tr>
    </tbody>  
  </table>

因此,您可以看到产品的信息分布在各种<tr>. 如果我尝试通过使用来刮取它们,<td>我最终会得到许多nil值,因为其中一些<td>拥有.simImage而另一些则没有。对于.simProductInfo.

以前有人遇到过类似的事情吗?有什么解决方法吗?

4

1 回答 1

2

您可以尝试在两个单独的数组中收集 ASIN 和 URL,然后压缩它们。

asins = product.css('.simImage a img').map { |n| n.value[/(?<=\/)[A-Z\d]{5,}/] }
urls = product.css('.simProductInfo a').map(&:to_s)

asins.zip(urls).map { |asin, url| {image_url: url, asin: asin} }
于 2013-08-30T07:06:51.533 回答