废弃在不同元素之间传播的产品信息?

时间:2013-08-30 05:33:27

标签: ruby nokogiri

我正在使用以下内容删除页面信息:

  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而其他{{1}}没有。与{{1}}相同。

有没有人遇到过类似的事情?有没有解决方法呢?

1 个答案:

答案 0 :(得分: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} }