Просто заявить: я не опытный программист, не сердитесь на меня ... Я изучаю возможности проведения исследований (у меня есть навыки программирования на Python).scrapy несколько классов предметов с методом извлечения внутри них
слом сайт: давайте представим, что мы можем иметь некоторую информацию, извлеченные из opengraph (и :) как «Заголовок», «URL» и «описание», и другую информацию из schema.org, например, 'author', и в последнем случае мы хотим, чтобы 'title', 'url', 'description' и 'date', которые могут быть извлечены из «нормального» XPath из HTML, только если их нет в opengraph (og :) и schema.org.
Я создаю 3 класса предметов OpengraphItem (Item), SchemaItem (Item) и MyItem (Item), в разделенных файлах .py. Внутри каждого класса было бы функцию экстракта для извлечения полей, как в этом примере:
class OpengraphItem(Item):
title = Field()
url = Field()
description = Field()
def extract(self, hxs):
self.title = hxs.xpath('/html/head/meta[@property="og:title"]/@content').extract()
self.url = hxs.xpath('/html/head/meta[@property="og:url"]/@content').extract()
self.description = hxs.xpath('/html/head/meta[@property="og:description"]/@content').extract()
Затем в коде паука функция экстракт будет называться так:
def parse_item(self, response):
hxs = HtmlXPathSelector(response)
my_item = MyItem()
item_opengraph = OpengraphItem()
item_opengraph.extract(hxs)
item_schema = SchemaItem()
item_schema.extract(hxs)
my_item['date']= hxs.xpath('/html/body//*/div[@class="reviewDate"]/span/time[@class="dtreviewed"]/@content').extract()
my_item['title'] = item_opengraph.get('title', None)
my_item['url'] = item_opengraph.get('url', None)
my_item['description'] = item_opengraph.get('description', None)
if my_item['url'] == None:
my_item['url'] = response.url
if my_item['title'] == None:
my_item['title'] = hxs.xpath('/html/head/title/text()').extract()
if my_item['description'] == None:
my_item['description'] = hxs.xpath('/html/head/meta[@name="description"]/@content').extract()
return my_item
Есть ли в этом смысл? У вас есть встроенный метод извлечения внутри класса предметов?
Я рассмотрел другие вопросы: scrapy crawler to pass multiple item classes to pipeline - и я не знаю, правильно ли иметь только один items.py с несколькими и разными классами внутри него.
Scrapy item extraction scope issue и scrapy single spider to pass multiple item classes to pipeline - Должен ли я иметь Itempipeline? Я не знаком с ними, но в документации по скрипированию говорится о его использовании, и я думаю, что это не соответствует этой проблеме. И загрузчики предметов?
Я пропустил некоторые части кода.
Да. Вы можете поместить классы в разные файлы или в один и тот же файл. Если они находятся в разных файлах, просто убедитесь, что вы правильно их импортируете. – MattDMo
Кажется, вы задаете много вопросов в своем вопросе. Возможно, было бы более ясно, если бы вы задавали разные вопросы, по одному для каждого конкретного сомнения или проблемы. –