Переменные, которые должны быть определены, дают мне NameErrors, как мне это исправить? - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь добавить значения к данным для выгрузки в файл json, но постоянно получаю эту ошибку:

Traceback (most recent call last):
  File "C:\Users\techn\Anaconda3\lib\site-packages\scrapy\utils\defer.py", line 102, in iter_errback
    yield next(it)
  File "C:\Users\techn\Anaconda3\lib\site-packages\scrapy\spidermiddlewares\offsite.py", line 30, in process_spider_output
    for x in result:
  File "C:\Users\techn\Anaconda3\lib\site-packages\scrapy\spidermiddlewares\referer.py", line 339, in <genexpr>
    return (_set_referer(r) for r in result or ())
  File "C:\Users\techn\Anaconda3\lib\site-packages\scrapy\spidermiddlewares\urllength.py", line 37, in <genexpr>
    return (r for r in result or () if _filter(r))
  File "C:\Users\techn\Anaconda3\lib\site-packages\scrapy\spidermiddlewares\depth.py", line 58, in <genexpr>
    return (r for r in result or () if _filter(r))
  File "C:\Users\techn\scrapy\KYCSpider\KYCSpider\spiders\kycspider.py", line 92, in parse
    data['Government Members'].append({
NameError: name 'data' is not defined

Эта проблема возникла ранее с другой переменной, в которой не сказано, что она определенанесмотря на то, что определены вне функции.Я в недоумении относительно того, что я делаю здесь неправильно.

class KYCSpider(scrapy.Spider):
    name = 'kycspider'
    start_urls = [
        'http://www.vlada.si/en/about_the_government/members_of_government/'
        ]
    allowed_domains = ['www.vlada.si']
    maxdepth = 1
    isNewDoc = False
    oldData = ''
    newFile = ''
    data = {}
    data['Government Members'] = []

    def spider_opened(self):
        print("OPENED SPIDER")
        global newFile, oldData, isNewDoc
        #If data.json exists, copy its data into a string and trunctuate it
        try:
            oldFile = open('data.json', 'r')
            oldData = oldFile.read()
            isNewDoc = False
        #If data.json file doesn't exist, tell spider that this is a new doc
        except FileNotFoundError:
            isNewDoc = True
        newFile = open('data.json', 'w')
        newFile.write("[")


    def parse(self, response):
        global data, isNewDoc
        #code that assigns values to from_name, from_designation, etc.

        data['Government Members'].append({
                    'name': from_name, 
                    'designation': from_designation,
                    'dob': dob,
                    'address': address,
                    'email': email,
                    'phone': phone,
                    'website': website,
                    'sourceURL': sourceURL,
                    'operation': operation
            })

Я ожидаю, что к данным будет добавлена ​​какая-либо извлеченная информация, поэтому я могу выгрузить ее в файл JSON, когда завершит сканирование..

1 Ответ

2 голосов
/ 15 мая 2019

Это не global, просто класс, так что self.Т.е. используйте self.data везде, где вы используете data в этом методе. Пример:

# remove the global statment
self.data['Government Members'].append(...)

Хотя вы должны использовать конструктор, а не просто определять переменные в открытом виде, такие как:

def __init__(self):
    self.data = {'Government Members': []}
def parse(self):
    print(self.data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...