Найти - Пользователи
Полная версия: Нужна помощь с заданием переменной
Начало » Python для новичков » Нужна помощь с заданием переменной
1 2 3
Dimazzzzzz
Пишу прогу для курсача, должна извлекать последнюю ставку и победителя с одного сайта, использую строчный анализ html кода, чтобы получить данные. Проблема заключается в том, что Питон не видит переменную. Вот сам код:
#/usr/bin/python
#-*- coding: cp1251 -*-
import urllib
url = 'http://www.vezetmne.ru/auctions/803338197'
urllib.urlretrieve(url=url, filename='COD.html')
infile = open('COD.html')
lines = infile.readlines()
for i in range(len(lines)):
line = lines# так короче
if ‘cbid=alterStep’ in line:
A = lines.strip()
Raznost = A
if ‘item_bigcell’ in line:
t1 = lines.strip() #t1 - вспомогательная переменная для типа
t2 = lines.strip() #t2 - вспомогательная переменная для типа
t3 = lines.strip() #t3 - вспомогательная переменная для типа
t4 = lines.strip() #t4 - вспомогательная переменная для типа
type1 = t1
type2 = t2
type3 = t3
type4 = t4
if ‘<div class=“history” id=“history”>’ in line:
C = lines.strip()
B = lines.strip()
Stavka = C #для денег будем брать полный, т.к. там еще справа ник хз какой длины
IGROK = C # А вот для ника возьмем с минусом
Stavka1 = B
IGROK1 = B
break
if ‘Участ’ in type1:
ty = ‘Не требует свободных слотов’
elif ‘Кажд’ in type1:
ty = ‘Ограниченное число ставок’
elif ‘Лог’ in type1:
ty = ‘Логины зашифрованы’
else:
ty = 0

infile.close()
print Stavka, ‘Ставка\n’, IGROK, ‘Победитель аукциона\n’, Stavka1,'Предпоследняя ставка\n', IGROK1,'Предпоследний участник\n', Raznost,'Шаг, с которым велись торги\n', type1,'\n', type2,'\n', type3,'\n', type4, ‘\n’, ty

При добавлении участка, выделенного жирным возникает след. ошибка: NameError: name ‘type1’ is not defined
Я если честно не понимаю почему он не видит переменную. Если кто значет в чем проблема - помогите плиз Или может кто знает другой алгоритм, мне нужно сделать так, чтобы тот кусочек из type1 преобразовывался в описание типа аукциона, но только если в кусочке есть определенная фраза. Например type4 мне не подходит, т.к. он уже отображает не тип аукциона, а код html
Duck-Pagan
Вам ясно написано: name ‘type1’ is not defined - type1 - не определена. Подскажу, по секрету, type2 и
type3 и даже type4 так же не определены.
Они у вас определяются лишь в том случае, если if ‘item_bigcell’ in line: - эта строчка истина. Видимо она у вас ложна. Если вы используете конструктор if <>: и в нем объявляете какие-то переменные, которые используются позже, пишите в этом случае так же и else(elif).
Dimazzzzzz
Мысль хорошая, но в моем случае дело не в этом. if ‘item_bigcell’ in line выполнено, поскольку:
а) я лично искал в коде от какой строчки и как считать
б) неоспоримый аргумент. Без части, выделенной жирным все данные выводятся
Duck-Pagan
Dimazzzzzz
Мысль хорошая, но в моем случае дело не в этом. if ‘item_bigcell’ in line выполнено, поскольку:
а) я лично искал в коде от какой строчки и как считать
б) неоспоримый аргумент. Без части, выделенной жирным все данные выводятся

Эти два аргумента неоспоримо подтверждают истинность условия .
Но все же - закомментируй строку (#if ‘item_bigcell’ in line - расставь соответственно уровни без нее. Проверь выполняется ли код с присутствием жирной части %).
А есть этот код на гитхабе или еще где, где можно посмотреть на уровни?
Dimazzzzzz
Вот код вставил вроде с уровнями:
#/usr/bin/python
#-*- coding: cp1251 -*-
import  urllib
url = 'http://www.vezetmne.ru/auctions/803338197'
urllib.urlretrieve(url=url, filename='COD.html')
infile = open('COD.html')
lines = infile.readlines()
for i in range(len(lines)):
    line = lines[i]# так короче
    if 'cbid=alterStep' in line:
       A = lines[i].strip()
       Raznost = A[24:28]
    if 'item_bigcell' in line:
        t1 = lines[i+1].strip() #t1 - вспомогательная переменная для типа
        t2 = lines[i+2].strip() #t2 - вспомогательная переменная для типа
        t3 = lines[i+3].strip() #t3 - вспомогательная переменная для типа
        t4 = lines[i+4].strip() #t4 - вспомогательная переменная для типа
        type1 = t1[10:18]
        type2 = t2[10:18]
        type3 = t3[10:20]
        type4 = t4[11:20]
    if '<div class="history" id="history">' in line:
       C = lines[i+3].strip()
       B = lines[i+5].strip()
       Stavka = C[21:30] #для денег будем брать полный, т.к. там еще справа ник хз какой длины
       IGROK = C[53:-25] # А вот для ника возьмем с минусом
       Stavka1 = B[21:30]
       IGROK1 = B[53:-25]
       break
    if 'Участ' in type1:
        ty = 'Не требует свободных слотов'
    elif 'Кажд' in type1:
        ty = 'Ограниченное число ставок'
    elif 'Лог' in type1:
        ty = 'Логины зашифрованы'
    else:
        ty = 0
    infile.close()
print Stavka, 'Ставка\n', IGROK, 'Победитель аукциона\n', Stavka1,'Предпоследняя ставка\n', IGROK1,'Предпоследний участник\n', Raznost,'Шаг, с которым велись торги\n', type1,'\n', type2,'\n', type3,'\n', type4

Какой смысл ее комментировать? Без нее вся программа выполняться не будет, тут не будет заданно в какой линии вообще что искать.

P.S. как и ожидалось - выдает оишбку
s0rg
exec("=".join(["type{}".format(i) for i in xrange(1, 5)]) + " = None" )
Перед for
Dimazzzzzz
Спасибо!)) Ошибка исчезла, только появилась новая
if ‘Участ’ in type1:
TypeError: argument of type ‘NoneType’ is not iterable
Вот так всегдя у меня с Питоном
Duck-Pagan
Dimazzzzzz, я все правильно сказал еще в первый раз, смотри что у тебя происходит:
Во-первых у тебя есть цикл, заданный длинной lines.
В этом цикле у тебя задаются переменные: type1,type2,type3,type4 - причем они задаются лишь в какой-то МОМЕНТ (первый, второй, пятый, десятый - и ЭТО важно).
Во-вторых, твоя жирная часть кода задается на том же уровне и что и переменные от которых она зависит(что не очень хорошо) (при это в момент выполнения этой части кода, переменные могут быть не заданы, что собственно и происходит)
Почему без жирной части все работает? - Потому что цикл выполняется, и только после этого выводятся эти самые переменные, т.е. когда они уже заданы в какой-то момент прогонки цикла(т.б если ты утверждаешь что условие 100% истинно!).
Вот собственно и все. Дело в цикле.
Dimazzzzzz
Я тебя понял, смотри какая штука получается, если поменять уровни:
#/usr/bin/python
#-*- coding: cp1251 -*-
import  urllib
url = 'http://www.vezetmne.ru/auctions/803338197'
urllib.urlretrieve(url=url, filename='COD.html')
infile = open('COD.html')
lines = infile.readlines()
exec("=".join(["type{}".format(i) for i in xrange(1, 5)]) + " = None" )
for i in range(len(lines)):
    line = lines[i]# так короче
    if 'cbid=alterStep' in line:
       A = lines[i].strip()
       Raznost = A[24:28]
    if 'item_bigcell' in line:
        t1 = lines[i+1].strip() #t1 - вспомогательная переменная для типа
        t2 = lines[i+2].strip() #t2 - вспомогательная переменная для типа
        t3 = lines[i+3].strip() #t3 - вспомогательная переменная для типа
        t4 = lines[i+4].strip() #t4 - вспомогательная переменная для типа
        type1 = t1[10:18]
        type2 = t2[10:18]
        type3 = t3[10:20]
        type4 = t4[11:20]
    if '<div class="history" id="history">' in line:
       C = lines[i+3].strip()
       B = lines[i+5].strip()
       Stavka = C[21:30] #для денег будем брать полный, т.к. там еще справа ник хз какой длины
       IGROK = C[53:-25] # А вот для ника возьмем с минусом
       Stavka1 = B[21:30]
       IGROK1 = B[53:-25]
       break
       if 'Участ' in type1:
           ty = 'Не требует свободных слотов'
       elif 'Кажд' in type1:
           ty = 'Ограниченное число ставок'
       elif 'Лог' in type1:
           ty = 'Логины зашифрованы'
       else:
           ty = 0
    infile.close()
print Stavka, 'Ставка\n', IGROK, 'Победитель аукциона\n', Stavka1,'Предпоследняя ставка\n', IGROK1,'Предпоследний участник\n', Raznost,'Шаг, с которым велись торги\n', type1,'\n', type2,'\n', type3,'\n', type4,'\n',ty

Тут уже почему-то проблема в ty получается, выдает ошибку вот такую:
print Stavka, ‘Ставка\n’, IGROK, ‘Победитель аукциона\n’, Stavka1,'Предпоследняя ставка\n', IGROK1,'Предпоследний участник\n', Raznost,'Шаг, с которым велись торги\n', type1,'\n', type2,'\n', type3,'\n', type4,'\n',ty
NameError: name ‘ty’ is not defined

P.S. Проблема решилась, подумал, что рано закрыл цикл и убрал break. Помогло. Только непонятно почему он в прошлом варианте не выводил, но это уже не важно вроде Спасибо всем, кто откликнулся!)
s0rg
Многоуважаемый Dimazzzzzz, вам не приходило в голову, что для того, чтобы парсить html, человечество изобрело что-то более удобное чем find/split ?
Например lxml:
#!/usr/bin/env python
#-*- coding: utf8 -*-
import urllib2
from lxml.html import document_fromstring


def get_aukcion_result(aukcion_id):
url = 'http://www.vezetmne.ru/auctions/{}'.format(aukcion_id)
try:
resp = urllib2.urlopen(url)
except URLError, e:
print '[-] Error: {}'.format(e.reason)
return
html = resp.read()
doc = document_fromstring(html)
tab_data, row_data = [], []
idx = 1
for e in doc.xpath('/html/body/center/table/tr/td/table/tr[3]/td/table[2]/tr/td[3]/div/div/table/tr/*')[3:]:
row_data.append(e.text.strip())
if idx == 3:
idx = 0
tab_data.append(row_data)
row_data = []
idx += 1

for row in tab_data:
print u'Amount: {} User: {} Type: {}'.format(row[0], row[1], row[2])


get_aukcion_result(803338197)
Выдает:

Amount: 35.25 руб. User: Kludor Type: ручная
Amount: 35.00 руб. User: Koshka-A Type: авто
Amount: 34.75 руб. User: Kludor Type: ручная
Amount: 34.50 руб. User: Koshka-A Type: авто
Amount: 34.25 руб. User: Kludor Type: ручная
Amount: 34.00 руб. User: Koshka-A Type: авто
Amount: 33.75 руб. User: Kludor Type: ручная
Amount: 33.50 руб. User: Koshka-A Type: авто
Amount: 33.25 руб. User: Kludor Type: ручная
Amount: 33.00 руб. User: Koshka-A Type: авто
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB