Уведомления

Группа в Telegram: @pythonsu

#1 Март 18, 2009 14:53:01

alex_losk
От:
Зарегистрирован: 2009-03-02
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Python. Mechanize & ClientForm. Не передергивая страницу 2 раза читать

Господа, осваиваю давно желаемое. Без задачи и нет стимула. нашел серьезное. не сплю вторые сутки. Прошу помощи в рекогнасцировке местности:
ЗАДАЧА:
есть некая страница, ее необходимо
* и заполнить и отправить
* и знать ее код, чтоб вынуть кусок
* не перечитывать, не обновлять

я, штудируя кучу доков понял, что первую часть проще делать на библитеках:
1* from ClientForm import ParseResponse # заполнение форм
2* import mechanize # назову эмуляцией браузера

Пример 1.

from ClientForm import ParseResponse
...
print '***START on url ', url
response = urllib2.urlopen(url)
response2 = response

body = response.read()
#response.close() #все таки считаю, что нужно закрыть, так как буфер может не слиться, хотя...
file(Local_Path + File_Name, 'wb').write(body)
print 'Записали файл с телом страницы для своих нужд. НАДО'

#парсим стандартным инструментом библиотеки
forms1 = ParseResponse(response, backwards_compat=False)
form = forms1[1]
print '***MAKE FORM', form

form['field1'] = MSG_1
form['field2'] = MSG_2

response3 = urllib2.urlopen(form.click())
print response3.read() #читаем что получилось
...
не арбайтен. я не сильно знаток программирования в целом, но понимаю (хоть и пытался обойтись порождениями объектов) что не пройдет. или парсим и отправляем на страницу заполненную форму ИЛИ читаем ее и указатель в конце.

2 * сдела аналог на mechanize
import mechanize
...
print '***START on url ', url

br = mechanize.Browser()
cj = mechanize.CookieJar()
br.set_cookiejar(cj)
response = br.open(url)
#print 'Добро пожаловать на ', br.title()

# assert(br.viewing_html()) # по русски расскажите чо это?

body = response.read()
response.close()
file(Local_Path + File_Name, 'wb').write(body)
print 'Записали файл с телом страницы для последующих действий'

#response1 = br.back() # back to cheese shop (same data as response1)
response.seek(0) # как декларируется похоже на файловый тип. посему пытаюсь указатель всунуть на начало

#br.select_form(name="addform") # смотрим строчку снизу - ни какой разницы нет
br.select_form(nr=1)
br['body1'] = MSG_1
br['body2'] = MSG_2
for form in br.forms(): # смотрим на форму
print form

return br.submit() # пытаемся комитить
понимаю, что в методе mechanize как бы прозрачней. НО
но у меня не получается сначало читать и записывать url сайта с содержимым, а потом заполнять форму и отправлять ее, не передергивая страницу. это и в первом и во втором случае.

и последнее. есть такое для mechanize
br = mechanize.Browser()
br.viewing_html() # !!!??? ху из это
документации скудно мало. я не понимаю, что это. по описанию в разных местах, то TRUE FALSE запрашиваемое html код, и встречал, что выдает код (тут загвоздка - выдает в некий адрес памяти или сам текст? - не разобрался)

толкните в нужном направлении.
заранее благодарен.



Офлайн

#2 Дек. 13, 2009 18:07:20

plusplus
От:
Зарегистрирован: 2009-01-05
Сообщения: 418
Репутация: +  15  -
Профиль   Отправить e-mail  

Python. Mechanize & ClientForm. Не передергивая страницу 2 раза читать

Тоже столкнулся с проблемой, когда используешь ParseResponse, то хтмл-код страницы уже не получить. Нашел следующий выход: использовать ParseFile. Для примера:

response = opener.open(req)
url = response.geturl()
the_page = response.read()
fl = StringIO.StringIO(the_page)
forms = ParseFile(fl, url, backwards_compat=False)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version