Форум сайта python.su
0
Пишу прогу для курсача, должна извлекать последнюю ставку и победителя с одного сайта, использую строчный анализ 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
Офлайн
0
Вам ясно написано: name ‘type1’ is not defined - type1 - не определена. Подскажу, по секрету, type2 и
type3 и даже type4 так же не определены.
Они у вас определяются лишь в том случае, если if ‘item_bigcell’ in line: - эта строчка истина. Видимо она у вас ложна. Если вы используете конструктор if <>: и в нем объявляете какие-то переменные, которые используются позже, пишите в этом случае так же и else(elif).
Офлайн
0
Мысль хорошая, но в моем случае дело не в этом. if ‘item_bigcell’ in line выполнено, поскольку:
а) я лично искал в коде от какой строчки и как считать
б) неоспоримый аргумент. Без части, выделенной жирным все данные выводятся
Офлайн
0
Dimazzzzzz
Мысль хорошая, но в моем случае дело не в этом. if ‘item_bigcell’ in line выполнено, поскольку:
а) я лично искал в коде от какой строчки и как считать
б) неоспоримый аргумент. Без части, выделенной жирным все данные выводятся
.
- расставь соответственно уровни без нее. Проверь выполняется ли код с присутствием жирной части %). Офлайн
0
Вот код вставил вроде с уровнями:
#/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
Отредактировано Dimazzzzzz (Май 9, 2012 17:00:34)
Офлайн
25
exec("=".join(["type{}".format(i) for i in xrange(1, 5)]) + " = None" )Офлайн
0
Спасибо!)) Ошибка исчезла, только появилась новая
if ‘Участ’ in type1:
TypeError: argument of type ‘NoneType’ is not iterable
Вот так всегдя у меня с Питоном 
Офлайн
0
Dimazzzzzz, я все правильно сказал еще в первый раз, смотри что у тебя происходит:
Во-первых у тебя есть цикл, заданный длинной lines.
В этом цикле у тебя задаются переменные: type1,type2,type3,type4 - причем они задаются лишь в какой-то МОМЕНТ (первый, второй, пятый, десятый - и ЭТО важно).
Во-вторых, твоя жирная часть кода задается на том же уровне и что и переменные от которых она зависит(что не очень хорошо) (при это в момент выполнения этой части кода, переменные могут быть не заданы, что собственно и происходит)
Почему без жирной части все работает? - Потому что цикл выполняется, и только после этого выводятся эти самые переменные, т.е. когда они уже заданы в какой-то момент прогонки цикла(т.б если ты утверждаешь что условие 100% истинно!).
Вот собственно и все. Дело в цикле.
Офлайн
0
Я тебя понял, смотри какая штука получается, если поменять уровни:
#/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
Спасибо всем, кто откликнулся!)
Отредактировано Dimazzzzzz (Май 9, 2012 17:35:06)
Офлайн
25
Многоуважаемый 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)
Офлайн