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 提取器。
我保证我已经通读了这个问题的其他版本,但我找不到与我的情况相关的版本。如果有的话,我很抱歉,我已经盯着这个看了几个小时了。
我一直在玩这个,实际上在一个版本上得到了结果,所以知道它很接近。
'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 提取器。