我正在使用以下内容删除页面信息:
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}}相同。
有没有人遇到过类似的事情?有没有解决方法呢?
答案 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} }