2015-04-16 2 views
0

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

Я пропустил некоторые части кода.

+0

Да. Вы можете поместить классы в разные файлы или в один и тот же файл. Если они находятся в разных файлах, просто убедитесь, что вы правильно их импортируете. – MattDMo

+0

Кажется, вы задаете много вопросов в своем вопросе. Возможно, было бы более ясно, если бы вы задавали разные вопросы, по одному для каждого конкретного сомнения или проблемы. –

ответ

0

It is rigth to have the created extract method inside items class?

Это очень необычно. Я не могу сказать, что это «неправильно», поскольку код все равно будет работать, но обычно весь код, связанный со структурой страницы (например, селекторами), остается в Пауке.

Товарные погрузчики могут быть полезны для того, что вы пытаетесь сделать, вам обязательно нужно попробовать.

Другое дело, приписывать задание полей элементов как

def extract(self, hxs): 
     self.title = hxs [...] 

не будет работать. Предметы Scrapy - это как dicts, вместо этого вам следует назначить, например, self['title'].

+0

спасибо за ваш ответ, я попытался Защиту экстракт (самостоятельно, HxS.): самоуправления [ 'название'] = HXS [...] но он дает ошибку: «#exceptions.AttributeError: Использовать элемент ['title'] = [...] для установки значения поля^ SyntaxError: недействительный синтаксис " –

+0

self ['title'] без". " –

+0

спасибо за помощь –

Смежные вопросы