Почему Python ругается на переменную?

Ребят, всем привет.

Создаю парсер в рамках django.

Логика:

Через форму я передаю нужные переменные, их подхватывает функция parse_one - сканирует нужный мне элементы, задает в глобальную переменную ссылку на следующий элемент, выдает данные. Ссылку на следующий элемент подхватывает функция parse_two и так в цикле.

Если мы пихаем все в один файлик и запускает данный файл, то все отрабатывает. Если мы вот так вставляем во view, то при попытке запуска получается ошибка:

UnboundLocalError at /parse
local variable 'agent_client' referenced before assignment
Request Method: POST
Request URL: 127.0.0.1:8000/parse
Django Version: 1.9.2
Exception Type: UnboundLocalError
Exception Value:
local variable 'agent_client1' referenced before assignment
Exception Location: E:\jivofolder\marketing\views.py in parse_two, line 90
Python Executable: C:\python35\python.exe
Python Version: 3.5.1

E:\jivofolder\marketing\views.py in parse_two
"agent_client" : agent_client,


Т.е. система ругается на news.append в parse_two

#Константы
LOGIN_URL = "Ссылка логина"
URL = "Ссылка сайта"

#Парсер первой странички
def parse_one(USERNAME, PASSWORD, dialogue_url):

    session_requests = requests.session()

            # Create payload
    payload = {
        "email": USERNAME,
        "password": PASSWORD
    }

    # Perform login
    result = session_requests.post(LOGIN_URL, data = payload, headers = dict(referer = LOGIN_URL))

    # Scrape journal_url
    result = session_requests.get(URL, headers = dict(referer = URL))
    soup = BeautifulSoup(result.content)
    g_data = soup.find_all('a', class_ = 'icon note')[0].get('href')
    journal_url = "Ссылка элемента" + g_data

    # Scrape journal
    result2 = session_requests.get(dialogue_url, headers = dict(referer = dialogue_url))
    soup2 = BeautifulSoup(result2.content)
    try:
        agent_client = soup2.find_all('h2')[0].text
    except:
        pass
    try:
        information = soup2.find_all('div', class_ = "content block")[0].text
    except:
        pass
    try:
        dialogue_log = soup2.find_all('table', class_ = "table zeropadding transparent")[0].text
    except:
        pass
    news = []
    news.append({
            "agent_client" : agent_client,
            "information" : information,
            "dialogue_log" : dialogue_log,
        })
    next_dialogue_clear = soup2.find_all('a', id ="next")[0].get('href')
    global next_dialogue
    next_dialogue = "Ссылка следуюдешо элемента" + next_dialogue_clear
    return news

#Парсер следующих страничек
def parse_two(USERNAME, PASSWORD):

    session_requests = requests.session()

            # Create payload
    payload = {
        "email": USERNAME,
        "password": PASSWORD
    }


    result2 = session_requests.get(next_dialogue, headers = dict(referer = next_dialogue))
    soup2 = BeautifulSoup(result2.content)
    try:
        agent_client = soup2.find_all('h2')[0].text
    except:
        pass
    try:
        information = soup2.find_all('div', class_ = "content block")[0].text
    except:
        pass
    try:
        dialogue_log = soup2.find_all('table', class_ = "table zeropadding transparent")[0].text
    except:
        pass
    news = []
    news.append({
            "agent_client" : agent_client,
            "information" : information,
            # "dialogue_log" : dialogue_log,
        })
    next_dialogue_clear = soup2.find_all('a', id ="next")[0].get('href')
    next_dialogue = "Ссылка следуюдщего элемента" + next_dialogue_clear
    global next_dialogue
    return news

######################################

#Функция, которая вызывается в django

def parse(request):
    done = csrf(request)
    if request.POST:
        USERNAME = request.POST.get('logins', '')
        PASSWORD = request.POST.get('password', '')
        dialogue_url = request.POST.get('links', '')
        total_pages = int(request.POST.get('numbers', ''))
        news = []
        news.extend(parse_one(USERNAME, PASSWORD, dialogue_url))
        for page in range(2, total_pages + 1): # вот с этим проблема, если закоментить, то parse_one отрабатывает на ура.
            news.extend(parse_two(USERNAME, PASSWORD))
        contex = {
                    "news" : news,
                }
        done.update(contex)
        return render(request, 'marketing/parser.html', done)


P.s. не пинайтесь за копи-паст, пока нужно получить функционал, а потом уже допиливать.
  • Вопрос задан
  • 981 просмотр
Пригласить эксперта
Ответы на вопрос 3
@nirvimel
try:
    some_variable = some_function()
except:
    pass

Никогда так не делайте! Во-первых, except должен ловить конкретное исключение, а не все подряд. Во-вторых, если some_variable впервые инициализируется в блоке try (ранее ей значение не присваивалось), то вместо pass обязательно нужно задать some_variable какое-то значение по-умолчанию. Например:
try:
    some_variable = some_function()
except some_exception:
    some_variable = ""  # если some_function() должна возвращать строку
    # some_variable = 0  # если some_function() должна возвращать целое число
    # some_variable = []  # если some_function() должна возвращать список
    # some_variable = None  # если some_function() может вернуть None
Ответ написан
Комментировать
sim3x
@sim3x
Парсинг непредсказуемое действи по времени - не нужно его и близко ложить рядом со вью
Сделай https://docs.djangoproject.com/en/1.9/howto/custom...
и дергай ее через командную строку или внутри джанго

Ошибка, скорее всего в опечатке окло переменной agent_client
Ответ написан
Комментировать
@ilov3
Учу питон и джангу потому что модно
Согласен с sim3x по поводу времени ответа, но лучше заюзать очередь, например, https://github.com/ui/django-rq
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы