Python - 未定义全局名称

时间:2016-07-09 03:35:02

标签: python xpath scrapy scrapy-spider

我保证我已经阅读了这个问题的其他版本,但我无法找到与我的情况相关的版本。如果有的话,我道歉,我现在已经盯着这几个小时了。

我已经玩弄了很多东西并且实际上在一个版本上得到了结果,所以知道它已经接近了。

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

以下是确切的错误:对于start_urls中的listing_url_list: 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

2 个答案:

答案 0 :(得分:2)

使用spider1.start_urls而非start_urls

答案 1 :(得分: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与链接提取器一起使用。< / p>