使用scrapy在html表中解析任意数量的行(键:值对)

时间:2012-03-18 08:20:07

标签: python xpath scrapy web-crawler scrape

最近开始使用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))的简单循环,加上一些字符串连接完成了这项工作。

1 个答案:

答案 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