2016-07-09 2 views
2

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

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

Переменная 'start_URLs' определяется как список до функции, но по какой-либо причине не регистрируется на уровне глобального/модуля.

Вот точная ошибка: для listing_url_list в start_urls: NameError: глобальное имя 'start_urls' не определен

import time 
import scrapy 
from scrapy.http import Request 
from scrapy.selector import Selector 
from scrapy.spiders import CrawlSpider, Rule 
from scraper1.items import scraper1Item 

from scraper1 import csvmodule 

absolute_pos = './/*[@id="xpath"]/td/@class' 

class spider1(CrawlSpider): 
    name = 'ugh' 
    allowed_domains = ["ugh.com"] 
    start_urls = [ 
     "http://www.website.link.1", 
     "http://www.website.link.2", 
     "http://www.website.link.3" 
    ] 

    def parse(self, response): 
     Select = Selector(response) 
     listing_url_list = Select.xpath('.//*[@id="xpath"]/li/div/a/@href').extract() 
     for listing_url_list in start_urls: 
      yield scrapy.Request(listing_url, callback=self.parselisting, dont_filter=True) 

    def parselisting(self, response): 
     ResultsDict = scraper1Item() 
     Select = Selector(response) 
     ResultsDict['absolute_pos'] = Select.xpath(absolute_pos).extract() 
     ResultsDict['listing_url'] = response.url 
     return ResultsDict 
+1

'self.start_urls'? –

ответ

2

Вам нужно исправить start_requests() метод:

  • вы имели в виду использовать listing_url_list вместо start_urls
  • вы имели в виду использовать listing_url вместо listing_url_list в качестве переменной цикла
  • нет необходимости инстанцирует Selector - использование response.xpath() shortcut напрямую

Стационарное исполнение:

def parse(self, response): 
    listing_url_list = response.xpath('.//*[@id="xpath"]/li/div/a/@href').extract() 
    for listing_url in listing_url_list: 
     yield scrapy.Request(listing_url, callback=self.parselisting, dont_filter=True) 

Как примечание стороны, я думаю, вам не нужно CrawlSpider и может реально использовать обычный scrapy.Spider, так как вы на самом деле не используя rules с ссылками экстракторов.

+0

Знайте хорошее чтение об использовании ответа. против селектора (ответ)? – Winklevoss333

+1

@ Winklevoss333 не имеет ничего лучшего, чем ссылка, которую я опубликовал - страница документации содержит несколько примеров. Надеюсь, это поможет. – alecxe

2

использование spider1.start_urls вместо просто start_urls.

+0

Crap, как spider1.start_urls, так и self.start_urls исправляют непосредственную проблему, но затем дают проблему с листингом, который не определен ... – Winklevoss333

+0

@ Winklevoss333 не должен быть 'listing_url_list'? – Cnly

+0

Да, вы абсолютно правы. – Winklevoss333

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