2016-08-02 5 views
1

Я пытаюсь написать общий искателю для одной веб-страницы, которая называется со следующими аргументами:Переходя XPATH в качестве аргумента Scrapy

  • разрешённых доменов
  • URL для сканирования
  • XPATH к извлечение цены на веб-странице

Домены URL и разрешенные домены, кажется, работают правильно, но я не могу заставить аргумент xPath работать.

Я предполагаю, что мне нужно объявить переменную, чтобы она была правильной, поскольку другие два аргумента назначены существующим элементам класса.

Вот мой паук:

import scrapy 
from Spotlite.items import SpotliteItem 

class GenericSpider(scrapy.Spider): 
    name = "generic" 

    def __init__(self, start_url=None, allowed_domains=None, xpath_string=None, *args, **kwargs): 
     super(GenericSpider, self).__init__(*args, **kwargs) 
     self.start_urls = ['%s' % start_url] 
     self.allowed_domains = ['%s' % allowed_domains] 
     xpath_string = ['%s' % xpath_string] 

    def parse(self, response): 
     self.logger.info('Hi, this is an item page! %s', response.url) 
     item = SpotliteItem() 
     item['url'] = response.url 
     item['price'] = response.xpath(xpath_string).extract() 
     return item 

Я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "/usr/lib/python2.7/dist-packages/twisted/internet/defer.py", line 577, in _runCallbacks 
    current.result = callback(current.result, *args, **kw) 
    File "/home/ubuntu/spotlite/spotlite/spiders/generic.py", line 23, in parse 
    item['price'] = response.xpath(xpath_string).extract() 

NameError: глобальное имя 'xpath_string' не определен

Любая помощь будет оценен по достоинству!

Спасибо,

Майкл

ответ

1

У xpath_string как экземпляр переменной вместо:

import scrapy 
from Spotlite.items import SpotliteItem 

class GenericSpider(scrapy.Spider): 
    name = "generic" 

    def __init__(self, start_url=None, allowed_domains=None, xpath_string=None, *args, **kwargs): 
     super(GenericSpider, self).__init__(*args, **kwargs) 
     self.start_urls = ['%s' % start_url] 
     self.allowed_domains = ['%s' % allowed_domains] 
     self.xpath_string = xpath_string 

    def parse(self, response): 
     self.logger.info('Hi, this is an item page! %s', response.url) 
     item = SpotliteItem() 
     item['url'] = response.url 
     item['price'] = response.xpath(self.xpath_string).extract() 
     return item 
0

Добавление переменной в исходное объявление класса исправили проблему.

import scrapy 
from spotlite.items import SpotliteItem 


class GenericSpider(scrapy.Spider): 
    name = "generic" 
    xpath_string = "" 

    def __init__(self, start_url, allowed_domains, xpath_string, *args, **kwargs): 
     super(GenericSpider, self).__init__(*args, **kwargs) 
     self.start_urls = ['%s' % start_url] 
     self.allowed_domains = ['%s' % allowed_domains] 
     self.xpath_string = xpath_string 

    def parse(self, response): 
     self.logger.info('URL is %s', response.url) 
     self.logger.info('xPath is %s', self.xpath_string) 
     item = SpotliteItem() 
     item['url'] = response.url 
     item['price'] = response.xpath(self.xpath_string).extract() 
     return item