4 Réponses :
vous pouvez définir une représentation sous forme de chaîne personnalisée de votre élément
class InfoItem:
def __repr__(self):
return 'name: {}, phone: {}, address: {}'.format(self['name'], self.['phone'], self.['address'])
Dans votre araignée, remplacez item.items () par self.log (item.items ()) , le message du journal devrait être une liste de tuples dans l'ordre où vous les avez attribués dans votre araignée.
Une autre façon consiste à combiner la réponse que vous avez mentionnée dans votre message avec cette réponse
Le problème est dans la fonction __repr__ de Item . À l'origine, son code est:
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"]}
Donc, même si vous convertissez votre article en OrderedDict et que vous vous attendez à ce que les champs soient enregistrés dans le même ordre, cette fonction applique dict () et casse l'ordre.
Donc, je vous propose de le surcharger comme vous le souhaitez, par exemple:
import json
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
def __repr__(self):
return json.dumps(OrderedDict(self), ensure_ascii = False) # it should return some string
Et maintenant vous pouvez obtenir cette sortie:
def __repr__(self):
return pformat(dict(self))
Ajoutez ensure_ascii = False dans json.dump pour afficher les caractères dans l'apparence cjk.
L'ensemble de items.py qui peut générer des informations de débogage personnalisées dans l'apparence cjk est comme ci-dessous.
import scrapy
import json
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
def __repr__(self):
return json.dumps(OrderedDict(self),ensure_ascii = False)
#ensure_ascii = False ,it make characters show in cjk appearance.
class StockinfoItem(OrderedItem):
name = scrapy.Field()
phone = scrapy.Field()
address = scrapy.Field()
Vous pouvez personnaliser l'ordre des champs dans un fichier de sortie réel. Voir FEED_EXPORT_FIELDS .