【问题标题】:How to order xml with item fields in scrapy?如何在scrapy中使用项目字段订购xml?
【发布时间】:2023-04-05 22:15:05
【问题描述】:

我编写了一个蜘蛛,它会抓取网页并填充项目中的字段。该项目的字段如下

class exampleitem():
    ex1 = Field()
    ex2 = Field()
    ex3 = Field()
    ... and so forth

当我抓取并导出到 xml 文件时,字段的顺序变得混乱并返回类似这样的内容

<items>
    <item>
        <ex2> <value> xyz </value> </ex2>
        <ex3> <value> abc </value> </ex3>
        <ex1> <value> ghi </value> </ex1>
    </item>
    ... so forth
</items>

我想让 xml 按照它在我的 item.py 文件的 Fields() 中写入的确切顺序进行格式化。

过去一个小时左右我一直在做研究,我知道这与我的管道和使用 xmlitemexporter 有关,但我完全不知道如何定制我的管道,甚至不知道从哪里开始。

简而言之,我迷失在行话中,如果有人能指出我的方向或给我一个简短的示例代码来说明如何开始格式化我的抓取项目,我将不胜感激!

非常感谢

【问题讨论】:

    标签: python xml serialization scrapy


    【解决方案1】:

    scrapy Items 是 python dict 的包装器,将以不可预测的顺序返回项目字段

    def keys(self):
        return self._values.keys()
    

    要改变这一点,您可以在您的项目中覆盖此功能,例如:

    class exampleitem(Item):
        ex1 = Field()
        ex2 = Field()
        ex3 = Field()
    
        def keys(self):
            return ['ext1', 'ext2', 'ext3']
    

    或者,以更通用的方式实现DictItem 并使用python 的OrderedDict 而不是当前使用的python 的默认dict。

    【讨论】:

    • 你应该把你的名字从@Guy改成God。太感谢了!我不知道这存在......
    • 我尝试使用这种方法来订购我的 CSV 导出字段,但它不起作用。有什么想法吗?
    • 没有以什么方式工作?使用链接查看 DictItem 代码,查看行 fields={},这是一个常规的 python 字典,当被问及它的键时,它以任意顺序返回它们,在答案中我建议强制 keys(self) 函数的字段顺序返回,如果您当然必须使用项目类中的字段名称更改这些字段,我希望它会有所帮助。
    • 同样的事情发生在我身上,我对我的 items.py 文件进行了更改,但顺序仍然不是由我在那里所做的决定。
    猜你喜欢
    • 2020-06-28
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    相关资源
    最近更新 更多