如何按客户化的顺序对物料信息进行排序?

2024-10-06 11:38:34 发布

您现在位置:Python中文网/ 问答频道 /正文

scrapy中的默认顺序是字母表,我读过一些帖子,使用OrderedDict以自定义顺序输出项目。
我写了一个蜘蛛跟随网页。
How to get order of fields in Scrapy item

我的项目.py. 在

import scrapy
from collections import OrderedDict


class OrderedItem(scrapy.Item):
    def __init__(self, *args, **kwargs):
        self._values = OrderedDict()
        if args or kwargs:  
            for k, v in six.iteritems(dict(*args, **kwargs)):
                self[k] = v

class StockinfoItem(OrderedItem):
    name = scrapy.Field()
    phone = scrapy.Field()
    address = scrapy.Field()

简单的蜘蛛文件。在

^{pr2}$

什么时候该运行蜘蛛。在

2019-04-25 13:45:01 [scrapy.core.scraper] DEBUG: Scraped from <200 http://quotes.money.163.com/f10/gszl_600023.html>
{'address': ['浙江省杭州市天目山路152号浙能大厦'],'name': ['浙能电力'],'phone': ['0571-87210223']}

为什么我不能得到如下所需的订单?在

{'name': ['浙能电力'],'phone': ['0571-87210223'],'address': ['浙江省杭州市天目山路152号浙能大厦']}

感谢Gallaecio的建议,在此添加以下内容设置.py. 在

FEED_EXPORT_FIELDS=['name','phone','address']

执行spider并输出到csv文件。在

scrapy crawl  info -o  info.csv

现场订单在我的定制订单中。在

cat info.csv
name,phone,address
浙能电力,0571-87210223,浙江省杭州市天目山路152号浙能大

看看垃圾的调试信息:

2019-04-26 00:16:38 [scrapy.core.scraper] DEBUG: Scraped from <200 http://quotes.money.163.com/f10/gszl_600023.html>
{'address': ['浙江省杭州市天目山路152号浙能大厦'],
 'name': ['浙能电力'],
 'phone': ['0571-87210223']}

如何使调试信息按自定义顺序排列?如何获得以下调试输出?在

2019-04-26 00:16:38 [scrapy.core.scraper] DEBUG: Scraped from <200 http://quotes.money.163.com/f10/gszl_600023.html>
{'name': ['浙能电力'],
 'phone': ['0571-87210223'],
 'address': ['浙江省杭州市天目山路152号浙能大厦'],}

Tags: namefromcoreselffieldaddressargsphone
3条回答

问题出在Item__repr__函数中。最初它的代码是:

def __repr__(self):
    return pformat(dict(self))

因此,即使您将项转换为OrderedDict,并期望字段以相同的顺序保存,此函数也会将dict()应用于它并打破顺序。在

例如,我喜欢你提议的方式:

^{pr2}$

现在你可以得到这个输出:

2019-04-30 18:56:20 [scrapy.core.scraper] DEBUG: Scraped from <200 http://quotes.money.163.com/f10/gszl_600023.html>
{"name": ["\u6d59\u80fd\u7535\u529b"], "phone": ["0571-87210223"], "address": ["\u6d59\u6c5f\u7701\u676d\u5dde\u5e02\u5929\u76ee\u5c71\u8def152\u53f7\u6d59\u80fd\u5927\u53a6"]}

在spider将item.items()替换为self.log(item.items())时,logmsg应该是元组的列表,按照在spider中分配它们的顺序。在

另一种方法是将您在帖子中提到的答案与this answer结合起来

您可以定义项的自定义字符串表示形式

class InfoItem:
    def __repr__(self):
      return 'name: {}, phone: {}, address: {}'.format(self['name'], self.['phone'], self.['address'])

相关问题 更多 >