我正在使用类似以下内容来抓取页面的信息:
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
.
以前有人遇到过类似的事情吗?有什么解决方法吗?