Форум сайта python.su
Доброго утра.
Хочу парсить форму модулем ClientForm, но на некоторых страницах он ломается.
Ошибка:
Traceback (most recent call last):
File “D:\—P_Y_T_H_O_N–\A_N_A_L_O_G\ANALOG1\file1.py”, line 120, in ?
FORMS = ClientForm.ParseFile(f_parse,u, backwards_compat=False, encoding='la
tin-1')
File “C:\Python24\lib\site-packages\ClientForm.py”, line 952, in ParseFile
fp.feed(data)
File “C:\Python24\lib\sgmllib.py”, line 95, in feed
self.goahead(0)
File “C:\Python24\lib\sgmllib.py”, line 129, in goahead
k = self.parse_starttag(i)
File “C:\Python24\lib\sgmllib.py”, line 280, in parse_starttag
self.finish_starttag(tag, attrs)
File “C:\Python24\lib\sgmllib.py”, line 318, in finish_starttag
self.handle_starttag(tag, method, attrs)
File “C:\Python24\lib\sgmllib.py”, line 354, in handle_starttag
method(attrs)
File “C:\Python24\lib\site-packages\ClientForm.py”, line 587, in start_textare
a
raise ParseError(“start of TEXTAREA before start of FORM”)
ClientForm.ParseError: start of TEXTAREA before start of FORM
я пробую исправлять форму перед сохранением с помощью модуля BeautifulSoup
вот основной фрагмент ф-и
from BeautifulSoup import BeautifulSoup
soup0 = BeautifulSoup (s, fromEncoding=“utf-8”)
s = soup0.prettify()
s = unicode(s, ‘utf-8’).encode('utf-8')
но нищего не помагает.
Как исправить форму?
Офлайн
чогось мені здається що start of TEXTAREA before start of FORM )
Офлайн
tabajara
я и сам вижу ошибку, вопрос как сделать так чтобы ее не было? Может кто знает? Может сам ответ в ClientForm? Так подскажите пожалуйста.
Отредактировано (Апрель 24, 2007 19:26:13)
Офлайн
Причина:
якщо перекласти ‘'start of TEXTAREA before start of FORM’', то получиться щось таке ‘' початок тегу TEXTAREA перед початком тегу FORM’', тобто десь на сторінці є тег textarea, який не включений в жодну форму, тоді КлієнтФорм видає помилку.
Traceback (most recent call last):
File "./example.py", line 12, in <module>
backwards_compat=False)
File "build/bdist.linux-i686/egg/ClientForm.py", line 1007, in ParseFile
File "/home/cr/python-2.5b1/lib/python2.5/sgmllib.py", line 99, in feed
self.goahead(0)
File "/home/cr/python-2.5b1/lib/python2.5/sgmllib.py", line 133, in goahead
k = self.parse_starttag(i)
File "/home/cr/python-2.5b1/lib/python2.5/sgmllib.py", line 291, in parse_starttag
self.finish_starttag(tag, attrs)
File "/home/cr/python-2.5b1/lib/python2.5/sgmllib.py", line 340, in finish_starttag
self.handle_starttag(tag, method, attrs)
File "/home/cr/python-2.5b1/lib/python2.5/sgmllib.py", line 376, in handle_starttag
method(attrs)
File "build/bdist.linux-i686/egg/ClientForm.py", line 584, in start_textarea
ClientForm.ParseError: start of TEXTAREA before start of FORM
from ClientForm import _AbstractFormParser from ClientForm import debug def my_start_textarea(self, attrs): debug("%s", attrs) if self._current_form is None: self.outside_textarea = True return if self._textarea is not None: raise ParseError("nested TEXTAREAs") if self._select is not None: raise ParseError("TEXTAREA inside SELECT") d = {} for key, val in attrs: d[key] = val self._add_label(d) self._textarea = d def my_end_textarea(self): if not self.outside_textarea: debug("") if self._current_form is None: raise ParseError("end of TEXTAREA before start of FORM") if self._textarea is None: raise ParseError("end of TEXTAREA before start") controls = self._current_form[2] name = self._textarea.get("name") controls.append(("textarea", name, self._textarea)) self._textarea = None _AbstractFormParser.outside_textarea = False _AbstractFormParser.start_textarea = my_start_textarea _AbstractFormParser.end_textarea = my_end_textarea
Офлайн
tabajaraБрешу - є)))
Поставити новий КлієнтФорм з транку - там ніби такого нема.
Офлайн
Дякую тобі tabajara, допоміг.
Тільки поясни будь-ласка, що ти мав на увазі коли писав
“зробити манкі патч методу _AbstractFormParser. start_textarea і _AbstractFormParser.end_textarea”, більше цікавить як розуміти “зробити манкі патч методу”.
і що значить “Поставити новий КлієнтФорм з транку - там ніби такого нема”, те що поставити я розумію, а “з транку”.
І як ти додумався? Коли проблема буде виникати з іншими елементами форми, робити те саме?
Офлайн
philosofЩо написав (той код) - то і мав на увазу )
що ти мав на увазі коли писав “зробити манкі патч методу _AbstractFormParser. start_textarea і _AbstractFormParser.end_textarea”?
philosofhttp://en.wikipedi.org/wiki/Monkey_patch. Той код що я написав і є манкі патчем двох методів класу. Манкі патч - це тупа заміна якигось методів класу або зімпортованих функції своїми. В даному випадку start_textarea і end_textarea в КлієнтФорм поводять себе не так як тобі треба тому я написав свої дві функції, які роблять то шо треба і замінив ними стандартні. Після того коду при виклику тих методів будуть виконуватись не стандартні клієнтформівські, а мої функції.
цікавить як розуміти “зробити манкі патч методу”.
philosof'там ніби такого нема' - де? OpenSource проекти зберігаються в репозиторіях. Переважно в репозиторіях є три директорії: trunk - ведеться поточка розробка, код може бути з помилками, зато свіжий,
і що значить “Поставити новий КлієнтФорм з транку - там ніби такого нема”, те що поставити я розумію, а “з транку”?
philosofДо вчора я взагалі не знав що є така штука КлієнтФорм. На скачування, читання в гуглі шо то таке, знаходження і виправлення помилки я потратив приблизно 20 хвилин. Там не треба ні дочого додумуватись, по-моєму, там дуже гарно вибило помилку, просто знайшов рядок в якому вибивало:
І як ти додумався?
File "C:\Python24\lib\site-packages\ClientForm.py", line 587, in start_textarea
raise ParseError("start of TEXTAREA before start of FORM")
philosofНе знаю. Я тою штукою ніколи не користувався і не знаю як вона працює. Якшо з іншими тегами шось буде не так - треба сорсити і розбиратись шо не так.
Коли проблема буде виникати з іншими елементами форми, робити те саме?
Офлайн