Это касается почти того же кода, о котором я только что задал другой вопрос об этом утром, поэтому, если он выглядит знакомым, это потому, что это так.Список, заполненный Scrapy, возвращается до фактического заполнения
class LbcSubtopicSpider(scrapy.Spider):
...irrelevant/sensitive code...
rawTranscripts = []
rawTranslations = []
def parse(self, response):
rawTitles = []
rawVideos = []
for sel in response.xpath('//ul[1]'): #only scrape the first list
...irrelevant code...
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 "translations:"
print self.rawTranslations
def parse_translation(self, response):
for sel in response.xpath('//p[not(@class)]'):
rawTranslation = sel.xpath('text()').extract()
rawTranslation = ''.join(rawTranslation)
#print rawTranslation
self.rawTranslations.append(rawTranslation)
#print self.rawTranslations
Моя проблема заключается в том, что «печать self.rawTranslations» в parse(...)
метод печатает ничего более "[]"
. Это может означать одну из двух вещей: это может быть сброс списка прямо перед печатью, или это может быть печать перед вызовами parse_translation(...)
, которые заполняют список из ссылок parse(...)
. Я склонен подозревать, что это последнее, поскольку я не вижу никакого кода, который бы сбросил список, если только "rawTranslations = []"
в классе класса не запускается несколько раз.
Стоит отметить, что если я раскомментирую ту же строку в parse_translation(...)
, она напечатает желаемый результат, что означает, что он правильно извлекает текст, и проблема кажется уникальной для основного метода parse(...)
.
Мои попытки решить то, что я считаю проблемой синхронизации, были довольно бесцельными - я просто попытался использовать объект RLock на основе множества обучающих программ Google, которые я смог найти, и я на 99% уверен, что я его неправильно использовал, поскольку результат был идентичным.
Я пробовал Интернет в прошлый час, пытаясь лучше понять блокировки на Python и не очень далеко. Идея, которую я имею в голову, - освободить замок после завершения последнего посещения подстраницы, но я нашел удивительно мало примеров синтаксиса. – jah