Последовательный порядок для вывода товара | Scrapy

Я использую ScrapingHub API и использую shub для развертывания моего проекта. Тем не менее, результат пунктов, как показано:

Пример вывода товара

К сожалению, мне это нужно в следующем порядке -> Название, Дата публикации, Описание, Ссылка. Как я могу получить выходные данные именно в таком порядке для каждого класса элементов?

Ниже приведен краткий образец моего паука:

import scrapy

from scrapy.spiders import XMLFeedSpider
from tickers.items import tickersItem
class Spider(XMLFeedSpider):
    name = "Scraper"
    allowed_domains = ["yahoo.com"]
    start_urls = ('https://feeds.finance.yahoo.com/rss/2.0/headline?s=ABIO,ACFN,AEMD,AEZS,AITB,AJX,AU,AKERMN,AUPH,AVL,AXPW
                  'https://feeds.finance.yahoo.com/rss/2.0/headline?s=DRIO
                  'https://feeds.finance.yahoo.com/rss/2.0/headline?s=IDXG,IMMU,IMRN,IMUC,INNV,INVT,IPCI,INPX,JAGX,KDMN,KTOV,LQMT
                  )
    itertag = 'item'

    def parse_node(self, response, node):
        item = {}
        item['Title'] = node.xpath('title/text()',).extract_first()
        item['Description'] = node.xpath('description/text()').extract_first()
        item['Link'] = node.xpath('link/text()').extract_first()
        item['PublishDate'] = node.xpath('pubDate/text()').extract_first()
        return item

Кроме того, вот мой прикрепленный файл items.py, он находится в том же порядке, что и мой паук, поэтому я не знаю, почему вывод не в порядке.

Items.py:

import scrapy

class tickersItem(scrapy.Item):
    Title = scrapy.Field()
    Description = scrapy.Field()
    Link = scrapy.Field()
    PublishDate = scrapy.Field()

Синтаксис моего кода в порядке как для элементов, так и для файла паука, и я понятия не имею, как это исправить. Я новый программист на Python.

1 ответ

Вместо определения предметов в items.py, вы можете использовать collection.OrderedDict. Просто импортировать collections модуль и в parse_node метод, измените строку:

item = {}

ровняться:

item = collections.OrderedDict()

Или, если вы хотите определенные элементы, вы можете использовать подход, изложенный в этом ответе. Ваш items.py будет содержать этот код:

from collections import OrderedDict

from scrapy import Field, Item
import six

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

class tickersItem(OrderedItem):
    Title = Field()
    Description = Field()
    Link = Field()
    PublishDate = Field()

Затем вы должны также изменить свой код паука, чтобы использовать этот пункт, соответственно. Обратитесь к документации.

Другие вопросы по тегам