Mechanize无法看到某些隐藏的表单输入?

4 投票
2 回答
6603 浏览
提问于 2025-04-16 01:51

我想用 Mechanize 来抓取 这个网页。这个网页的表单元素看起来是这样的:

<form name="ctl00" method="post" action="PSearchResults.aspx?state=ME&amp;rp=" id="ctl00"> 
<div> 
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /> 
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" /> 
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="verylongstring" /> </div> 
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAgKb7POZAwK4v7ffCOmari00yJft/iuZBMdOH/zh9TDI" /> 
</div> 
</form>

我正在用 Mechanize 打印出这些控件,但它只能看到其中两个。如果我运行这个:

    br.select_form(name='ctl00')
    br.form.set_all_readonly(False) # allow changing the .value of all controls
    for control in br.form.controls:
        if not control.name:
            print " - (type) =", (control.type)
            continue  
        print " - (name, type, value) =", (control.name, control.type, br[control.name])

打印出来的结果只有这些:

- (name, type, value) = ('__VIEWSTATE', 'hidden', '/wEPDwUGNDQ5NTMwD2QWAgIBD2QWAgIHD2QWCgIBDw8WAh4E...more
- (name, type, value) = ('__EVENTVALIDATION', 'hidden', '/wEWAgKb7POZAwK4v7ffCOmari00yJft/iuZBMdOH/zh9TDI')

为什么 Mechanize 看不到 __EVENTTARGET 和 __EVENTARGUMENT 这两个字段呢?

2 个回答

5

接着说,我在使用 mechanize(一个 Python 库)时遇到了同样的问题,我试着把用户代理(UserAgent)设置成

br.addheaders = [('User-agent', 'Mozilla/5.0 (Windows NT 5.2; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11')]

网站推荐的样子:http://stockrt.github.com/p/emulating-a-browser-in-python-with-mechanize/

但是这样并没有解决问题,所以我决定用以下代码添加缺失的表单元素:

br.select_form(name='form')
br.form.set_all_readonly(False) # allow changing the .value of all controls
br.form.new_control('text','__EVENTARGUMENT',{'value':''})
br.form.new_control('text','__EVENTTARGET',{'value':''})
br.form.fixup()
br["__EVENTTARGET"] = 'lbSearch'
br["__EVENTARGUMENT"] = ''
6

这个网站在检查用户代理(useragent),然后给机械化工具(mechanize)提供不同的页面。

指定用户代理似乎可以正常工作。

Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6

这里有一个链接,展示了如何用mechanize设置用户代理。

撰写回答