Python - 未定义全局名称

Python - Global Name is not defined

我保证我已经通读了这个问题的其他版本,但我找不到与我的情况相关的版本。如果有的话,我很抱歉,我已经盯着这个看了几个小时了。

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

'start_URLs' 变量定义为函数之前的列表,但由于某些原因未在 global/module 级别上注册。

这是确切的错误:对于 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

使用 spider1.start_urls 而不是 start_urls.

您需要修正您的 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 和 link 提取器。