この質問は、ここでは他の多くのものとよく似ています。私はそれらをすべて読んだだけで、すべての人が既に試したことを言うので、私の状況との微妙な違いが見当たりません)。関数内でグローバル変数が認識されない
私は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)
これはグローバル「rawTranslations」が定義されていないため、任意の時点のいずれかの「印刷rawTranslations」または「rawTranslations.append(rawTranslationが)」と呼ばれるエラーを返します。
私が前に言ったように、私はこれをかなり広く見てきました。インターネット上の皆さんは、使用する機能の始めに「グローバル(名前)」行を追加するだけです私はそれにこれまで割り当てていないが、私はこれを必要とすべきではない)。私のグローバルラインがコメントアウトされているかどうかにかかわらず、同じ結果が得られます。この動作は、Pythonでグローバルがどのように動作するかについて私が読んだことのすべてを無視しているようです。これは、scrap.Request(...)を介して構文解析関数が呼び出される方法に関連するScrapyのクォークである可能性があります。
今回も同じ質問が表示されているようですが、今回はちょっとねじれているようですが、誰かがその底に来ることを願っています。ありがとう。
あなたのインデントがオフになっているように見え、例えば使用することができます関数 'parse'は必ずクラス" LbcSubtopicSpider "のメソッドですか?また、rawTranslationsはグローバル属性ではなくクラス属性であるように見えます。もちろん、解決策は 'self.rawTranslations'か' LbcSubtopicSpider.rawTranslations'(文脈に応じて)のどちらかを使うことです。 – syntonym
ここに貼り付けると、インデントが実際に破られました。修正されます。グローバル/クラス属性ポイントについては、違いがあるとは考えていないと思います。これは、おそらくJavaでコーディングされ、クラス内のすべてを実行する製品です。 – jah
'rawTranslations'はグローバルではなく、クラス変数です... – MisterMiyagi