Последовательный порядок для вывода товара | 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()
Затем вы должны также изменить свой код паука, чтобы использовать этот пункт, соответственно. Обратитесь к документации.