2016-07-09 100 views
2

我保证我已经读过这个问题的其他版本,但我无法找到与我的情况相关的一个。如果有的话,我表示歉意,现在我一直盯着这几个小时。Python - 全局名称没有定义

我一直在玩这个很多,实际上在一个版本上得到了结果,所以知道它很接近。

'start_URLs'变量被定义为函数之前的列表,但由于某种原因不会在全局/模块级别上注册。

这里是确切的错误:在start_urls listing_url_list: NameError:全局名称 'start_urls' 没有定义的只是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

了解任何有关使用回复的好消息。 vs选择器(响应)? – Winklevoss333

+1

@ Winklevoss333没有比我发布的链接更好的东西 - 文档页面包含多个示例。希望有所帮助。 – alecxe

2

使用spider1.start_urls代替。

+0

垃圾,既spider1.start_urls和self.start_urls修复了直接的问题,但随后产生的问题与listing_url没有被定义... – Winklevoss333

+0

@ Winklevoss333不应该是'listing_url_list'? – Cnly

+0

是的,你绝对正确。 – Winklevoss333

相关问题