2010-07-26 93 views
4

我想使用Mechanize刮this web page。该表单元素看起来像这样:机械化没有看到一些隐藏的表单输入?

<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> 

我使用机械化来打印控件,但它只能看到其中两个。如果我运行此:

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') 

为什么不能机械化 '看见' __EVENTTARGET和__EVENTARGUMENT领域?

回答

6

该网站正在检查用户代理和服务不同的网页机械化

指定以此为用户代理似乎工作确定

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

Here is a link显示如何将用户代理与机械化

设置
+0

我不同意。他们确实在源头上吗?有一个JavaScript'doPostBack'函数设置这些字段的值,但是它们已经存在:http://recognition.ncqa.org/PSearchResults.aspx?state=ME&rp= – AP257 2010-07-27 10:56:09

+0

@ AP257,用wget下载页面,curl或者urllib2,你会发现源代码与你的浏览器的源代码很不一样 – 2010-07-27 11:36:32

+0

@ AP257,我修改了我的答案,根本不是javascript,而是使用了正式的测试:( – 2010-07-27 12:30:20

5

作为后续,我有使用机械化(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"] = ''