2010-03-06 74 views
1

得到了我的小機械化代碼:Python的機械化忽略表單輸入的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來記錄它,以便我可以研究它嗎?我,我已經使用了'br.select_form(name ='edit_tumblelog')'(假設這是表單的名字),然後使用'br ['cname']',但是如果我可以找到文檔,方括號表示看起來很有趣爲它,並使其正確工作 - 謝謝! – 2010-03-06 23:48:40

回答

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 2013-05-29 17:14:08

6

也許這就是興趣的人:

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

這應該與HTML解析器解決問題。

+0

謝謝!謝謝!謝謝!你剛剛救了我。我希望我在3個小時前找到了這個! – 2012-01-30 06:54:12

+0

不客氣的隊友:)很高興我能幫忙。 – Julian 2012-01-30 20:14:34

+0

這工作奇蹟! – afreeland 2013-04-09 12:28:12

相關問題