Найти - Пользователи
Полная версия: Исправить форму для работы с ClientForm
Начало » Python для экспертов » Исправить форму для работы с ClientForm
1
philosof
Доброго утра.

Хочу парсить форму модулем 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')
но нищего не помагает.

Как исправить форму?
tabajara
чогось мені здається що start of TEXTAREA before start of FORM )
philosof
tabajara

я и сам вижу ошибку, вопрос как сделать так чтобы ее не было? Может кто знает? Может сам ответ в ClientForm? Так подскажите пожалуйста.
tabajara
Причина:
якщо перекласти ‘'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
Як виправити:
1. Зробити манкі патч методу _AbstractFormParser. start_textarea і _AbstractFormParser.end_textarea.
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
Помилок тепер не видає, але я не впевнений чи коректно обробляє дані. (
2. Поставити новий КлієнтФорм з транку - там ніби такого нема.
tabajara
tabajara
Поставити новий КлієнтФорм з транку - там ніби такого нема.
Брешу - є)))
philosof
Дякую тобі tabajara, допоміг.
Тільки поясни будь-ласка, що ти мав на увазі коли писав
“зробити манкі патч методу _AbstractFormParser. start_textarea і _AbstractFormParser.end_textarea”, більше цікавить як розуміти “зробити манкі патч методу”.

і що значить “Поставити новий КлієнтФорм з транку - там ніби такого нема”, те що поставити я розумію, а “з транку”.

І як ти додумався? Коли проблема буде виникати з іншими елементами форми, робити те саме?
tabajara
philosof
що ти мав на увазі коли писав “зробити манкі патч методу _AbstractFormParser. start_textarea і _AbstractFormParser.end_textarea”?
Що написав (той код) - то і мав на увазу )

philosof
цікавить як розуміти “зробити манкі патч методу”.
http://en.wikipedi.org/wiki/Monkey_patch. Той код що я написав і є манкі патчем двох методів класу. Манкі патч - це тупа заміна якигось методів класу або зімпортованих функції своїми. В даному випадку start_textarea і end_textarea в КлієнтФорм поводять себе не так як тобі треба тому я написав свої дві функції, які роблять то шо треба і замінив ними стандартні. Після того коду при виклику тих методів будуть виконуватись не стандартні клієнтформівські, а мої функції.

philosof
і що значить “Поставити новий КлієнтФорм з транку - там ніби такого нема”, те що поставити я розумію, а “з транку”?
'там ніби такого нема' - де? OpenSource проекти зберігаються в репозиторіях. Переважно в репозиторіях є три директорії: trunk - ведеться поточка розробка, код може бути з помилками, зато свіжий,
branch - якісь відгалуження від основної програми, експерименти,
tag - містяться готові дороблені версії продукту.
КлієнтФорм теж має свій репозиторій (svn) http://codespeak.net/svn/wwwsearch/ClientForm/. Щоб з нього шось скачати треба програму svn.

philosof
І як ти додумався?
До вчора я взагалі не знав що є така штука КлієнтФорм. На скачування, читання в гуглі шо то таке, знаходження і виправлення помилки я потратив приблизно 20 хвилин. Там не треба ні дочого додумуватись, по-моєму, там дуже гарно вибило помилку, просто знайшов рядок в якому вибивало:
File "C:\Python24\lib\site-packages\ClientForm.py", line 587, in start_textarea
raise ParseError("start of TEXTAREA before start of FORM")
і замінив той ПарсеЕрор на то шо я замінив в my_start_textarea. Якщо замінив start_textarea то треба змінити і end_textarea. Там ще змінну додав outside_textarea, бо без неї здається ніяк.

philosof
Коли проблема буде виникати з іншими елементами форми, робити те саме?
Не знаю. Я тою штукою ніколи не користувався і не знаю як вона працює. Якшо з іншими тегами шось буде не так - треба сорсити і розбиратись шо не так.
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