最近开始使用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类在抓取之前定义Fields的数量,而不是基于每个表。我有数百个表要执行此过程。
感谢您阅读此内容,感谢任何帮助。 :)
决议:@warawuk感谢您的帮助。我使用了你的建议,最后得到了一个三重嵌套列表。也许并不理想,但在继续与他们合作时,提取价值是微不足道的:
{"tRows":
[[["row1"], ["cell1", "cell2"]]
[["row2"], ["cell3", "cell4"]]
[["row3"], ["cell5", "cell6"]]
[["row4"], ["cell7", "cell8"]]] x100s of tables
}
为了处理任意数量的行,我使用正则表达式从每行中提取id并计算它们。使用range(len(rowNames))的简单循环,加上一些字符串连接完成了这项工作。
答案 0 :(得分:1)
你这里有太多问题,imo。
首先,看起来你的问题根本不是scrapy。这是关于组织你的数据和xpath。
我认为你必须在子任务中分割你的任务。第一个子任务是实际将数据提取到python数据结构中,然后尝试处理它。根据您的信息,我认为数据会像:
{
'table_1': {
'row_1': ['cell_1', 'cell_2'],
'row_2': ['cell_1', 'cell_2'],
...
},
'table_2': {
'row_1': ['cell_1', 'cell_2', 'cell_3'],
'row_2': ['cell_1', 'cell_2', 'cell_3'],
...
},
}
这是对的吗?
<强>更新强>
我遇到的困难是使用scrapy Item对象,就像这样 要求我的Item类在抓取之前定义Fields的数量, 而不是基于每个表。我想要数百张桌子 执行此过程。
AFAIK,Item Fields can store any Python object。 Scrapy Item
类只是存储Field
的地方,但scrapy不会以特殊方式处理这些字段。只有你将这些字段放在管道中并解释其中的数据。
因此,请选择适合您的任何商店格式。例如:
class Shirt(Item):
available_sizes = Field() # [(size1, amount1), (size2, amount2), ...] or {size1: amount1, size2: amount2, ...} if `size` is a hashable object