我知道这个问题看起来和这里的许多其他问题一模一样,因为我刚刚阅读了所有这些问题,他们都说要做我已经尝试过的事情,但它没有奏效(或者我错过了与我的情况的微妙差异)。这是我的情况:
我正在使用 Scrapy 和 Python 2.7.11 编写一个抓取器,我的代码如下所示(这是一个复制和粘贴,省略了不相关的行,但我可以根据要求重新添加它们):
class LbcSubtopicSpider(scrapy.Spider):
...omitted...
rawTranscripts = []
rawTranslations = []
def parse(self, response):
#global rawTranscripts, rawTranslations
rawTitles = []
rawVideos = []
for sel in response.xpath('//ul[1]'): #only scrape the first list
...omitted...
index = 0
for sub in sel.xpath('li/ul/li/a'): #scrape the sublist items
index += 1
if index%2!=0: #odd numbered entries are the transcripts
transcriptLink = sub.xpath('@href').extract()
#url = response.urljoin(transcriptLink[0])
#yield scrapy.Request(url, callback=self.parse_transcript)
else: #even numbered entries are the translations
translationLink = sub.xpath('@href').extract()
url = response.urljoin(translationLink[0])
yield scrapy.Request(url, callback=self.parse_translation)
print rawTitles
print rawVideos
print rawTranslations
def parse_translation(self, response):
global rawTranslations
for sel in response.xpath('//p[not(@class)]'):
rawTranslation = sel.xpath('text()').extract()
rawTranslations.append(rawTranslation)
每当调用"print rawTranslations"或"rawTranslations.append(rawTranslation)"时,这将返回错误,因为全局"rawTranslations"未定义。
正如我之前所说,我已经对此进行了广泛的研究,互联网上的几乎每个人都说只需在您使用/修改它的任何函数的开头添加一个"全局(名称)"行(尽管我从来没有分配给它,所以我什至不需要这个)。无论我的全局行是否被注释掉,我都会得到相同的结果。这种行为似乎违背了我读到的关于全局变量如何在 Python 中工作的所有内容,所以我怀疑这可能是一个与如何通过 scrapy 调用解析函数相关的 Scrapy 怪癖。请求(....)。
很抱歉发布似乎是您再次看到的相同问题,但这次似乎有点扭曲,希望有人可以深入了解它。谢谢。
在您的情况下,您要访问的变量不是全局的,而是在类的范围内。
global_var = "global"
class Example:
class_var = "class"
def __init__(self):
self.instance_var = "instance"
def check(self):
print(instance_var) # error
print(self.instance_var) # works
print(class_var) # error
print(self.class_var) # works, lookup goes "up" to the class
print(global_var) # works
print(self.global_var) # works not
仅当要写入全局变量时,才需要 global
关键字。提示:不要这样做,因为编写全局变量只会带来痛苦和绝望。仅使用全局变量作为(配置)常量。
global_var = "global"
class Example:
def ex1(self):
global_var = "local" # creates a new local variable named "global_var"
def ex2(self):
global global_var
global_var = "local" # changes the global variable
Example().ex1()
print(global_var) # will still be "global"
Example().ex2()
print(global_var) # willnow be "local"
如果你想在类中使用变量,你可以使用 self.xxx
class A:
... var = []
... def test(self):
... self.var.append(10)
... print self.var