【发布时间】:2012-03-18 08:20:06
【问题描述】:
最近开始使用 scrapy 库。我试图从一个网站上抓取他们销售的每种产品的表格略有不同。最终,我将使用这些数据来填充对象属性。现在,我只需要将其提取为 JSON 格式。
这是一个示例表:
<table id="table_1">
<tr id="row_1">
<td>cell_1</td>
<td>cell_2</td>
<td>cell_3</td>
</tr>
<tr id="row_2">
<td>cell_4</td>
<td>cell_5</td>
<td>cell_6</td>
</tr>
<tr id="row_n">
<td>cell_x</td>
<td>cell_y</td>
<td>cell_z</td>
</tr>
</table>
每一列代表一个不同的项目,即小号中号或大号 T 恤。 上表中将有 3 个项目,因此项目如下所示:
Item 1 {
row_1:cell_1
row_2:cell_4
row_n:cell_x
}
Item 2 {
row_1:cell_2
row_2:cell_5
row_n:cell_y
}
Item 3 {
row_1:cell_3
row_2:cell_6
row_n:cell_z
}
它们是结构良好的表格,没有“缺失”或“额外”单元格,尽管行数和列数是任意的。
我遇到的困难在于使用 scrapy Item 对象,因为这需要我的 Item 类在抓取之前定义字段的数量,而不是基于每个表。我有数百个表要执行此过程。
感谢您阅读本文,感谢您提供任何帮助。 :)
解决方案:@warawuk 感谢您的帮助。我使用了你的建议,最终得到了一个三重嵌套列表。也许并不理想,但在我继续使用它们时提取这些值已经足够微不足道了:
{"tRows":
[[["row1"], ["cell1", "cell2"]]
[["row2"], ["cell3", "cell4"]]
[["row3"], ["cell5", "cell6"]]
[["row4"], ["cell7", "cell8"]]] x100s of tables
}
为了处理任意数量的行,我使用正则表达式从每行中提取 id 并对其进行计数。一个使用 range(len(rowNames)) 的简单循环,加上一些字符串连接完成了这项工作。
【问题讨论】:
标签: python xpath scrapy web-crawler scrape