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

Python 使用scrapy解析html表中任意数量的行(键:值对),python,xpath,scrapy,web-crawler,scrape,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

最近开始使用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>
它们是结构良好的表,没有“缺少”或“额外”单元格,尽管行数和列数是任意的

我遇到的困难是使用scrapy Item对象,因为这需要我的Item类在刮取之前定义字段的数量,而不是基于每个表。我有数百个表要执行此过程

感谢您阅读本文,非常感谢您的帮助。:)

决议:@warawuk谢谢你的帮助。我采纳了你的建议,最终得到了一个三重嵌套列表。也许不太理想,但在我继续使用这些值时提取这些值已经足够简单了:

{"tRows": 
    [[["row1"], ["cell1", "cell2"]]
    [["row2"], ["cell3", "cell4"]]
    [["row3"], ["cell5", "cell6"]]
    [["row4"], ["cell7", "cell8"]]] x100s of tables
}

为了处理任意数量的行,我使用正则表达式从每一行中提取ID并计数。一个使用range(len(rowNames))的简单循环,再加上一些字符串连接完成了任务

我想,你的问题太多了

首先,看起来你的问题根本不是关于刮痧。它是关于组织数据和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对象,如下所示 需要my Item类在刮取之前定义字段数, 而不是基于每个表。我想买几百张桌子 在上执行此过程

阿飞。Scrapy
Item
类只是一个存储
Field
s的地方,但是Scrapy并没有以特殊的方式处理这些字段。只有您在管道中获取这些字段并解释其中的数据

因此,选择任何适合您的商店格式。例如:

class Shirt(Item):
    available_sizes = Field() # [(size1, amount1), (size2, amount2), ...] or {size1: amount1, size2: amount2, ...} if `size` is a hashable object

是的,没错。将数据转换成这种形式是主要的障碍。让我们将子任务1定义为对每个表中任意数量的行进行刮取,并将其转换为如下格式。根据我对零碎项的了解,似乎我需要提前定义字段的数量及其名称,在这种情况下,我希望在零碎期间确定这些字段的数量。您希望项实例中包含什么?对于表中的每一行,每个项中的键:值对应类似于“row_1”:“cell_1”,“row_2”:“cell_1”,等等。每行可以代表一个字段。那么单元格2、单元格3和其他单元格呢?谢谢您的回复。我发现我很难把每件事都说清楚。我编辑了我的原始帖子,以澄清并缩小问题的范围。请再看一看。
class Shirt(Item):
    available_sizes = Field() # [(size1, amount1), (size2, amount2), ...] or {size1: amount1, size2: amount2, ...} if `size` is a hashable object