2010-03-06 3 views
1

Got мой маленький код механизировать:Python Mechanize игнорирует формы ввода в HTML

br.open('http://tumblr.com/customize'); 
print br.response().read() 
print br.form['edit_tumblelog[cname]'] # there definitely is edit_tumblelog 
             # and br.form['edit_tumblelog[enable_cname]'] works fine 

Выход:

... 
<br/> 
            <input type="text" class="text_field" style="width:275px; min-width:0px; 
            margin:6px 0px; border:solid 1px #d2d2d2; 
            " 
            name="cname" id="cname" 
            onchange="form_changed = true;" 
            value="blog.yay.com"  
            /> 
... 
Traceback (most recent call last): 
    File "/tmp/temp_textmate.W6p5gh", line 51, in <module> 
    print br.form['edit_tumblelog[cname]'] 
    File "/Library/Python/2.6/site-packages/ClientForm-0.2.10-py2.6.egg/ClientForm.py", line 2891, in __getitem__ 
    File "/Library/Python/2.6/site-packages/ClientForm-0.2.10-py2.6.egg/ClientForm.py", line 3222, in find_control 
    File "/Library/Python/2.6/site-packages/ClientForm-0.2.10-py2.6.egg/ClientForm.py", line 3306, in _find_control 
ClientForm.ControlNotFoundError: no control matching name 'edit_tumblelog[cname]' 

Что я делаю неправильно?

+1

Я не знаком с обозначением квадратных скобок для определения элементов управления - можете ли вы указать URL-адрес, документирующий его, чтобы я мог его изучить? Me, я бы использовал 'br.select_form (name = 'edit_tumblelog')' (предполагая, что это имя формы), а затем использовал 'br ['cname']', но квадратная нотация кажется интересной, если я могу найти документы за это и заставим его работать правильно - спасибо! –

ответ

8

Обнаружена проблема. Это ошибка в механизме парсера HTML, который каким-то образом игнорирует следующий тег после появления <br/>. Обратите внимание, что <br /> отлично работает. Мое решение было вручную заменить те:

response = br.response() 
response.set_data(response.get_data().replace("<br/>", "<br />")) #Python mechanize is broken, fixing it. 
br.set_response(response) 

Очевидно, что лучшее решением является re.sub() всех тегов без пространства перед />.

+0

Просто решил мою почти полностью не связанную проблему. Этот ответ заслуживает собственного вопроса! – Penz

6

Может быть, это представляет интерес для тех, кто:

br=mechanize.Browser(factory=mechanize.RobustFactory()) 

Это должно решить проблему с HTML Parser.

+0

Спасибо! Спасибо! Спасибо! Ты просто спас меня. Хотел бы я найти это 3 часа назад !!! –

+0

Приветствую вас, товарищ :) Рад, что я мог бы помочь. – Julian

+0

Это сработало чудеса !!! – afreeland

Смежные вопросы