python mechanize提交表单将我踢回root

时间:2013-01-27 05:01:06

标签: python forms cookies submit mechanize

我有一个机械化python脚本,用于提交表格以查询药物信息。当我运行它时,它没有给我任何错误信息,但当我看到响应时,它不是我在浏览器视图源页面上看到的。我在提交后检查了网址:

这是我得到的:

http://www.accessdata.fda.gov/scripts/cder/drugsatfda/index.cfm

这是我应该得到的地址:

http://www.accessdata.fda.gov/scripts/cder/drugsatfda/index.cfm?fuseaction=Search.DrugDetails

我看到第二个网址不包含我的查询文字,这是否意味着我需要Cookie?如果是这样,怎么样?

这是我的代码段:

br = mechanize.Browser()
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
....
br.addheaders = [('User-agent', 'Mozilla/6.0 (X11; U; i686; en-US; rv:1.9.0.1) Gecko/2008071615 OS X 10.2 Firefox/3.0.1')]

fda_url2 = 'http://www.accessdata.fda.gov/scripts/cder/drugsatfda/index.cfm?fuseaction=Search.Addlsearch_drug_name'

print br.open(fda_url2).geturl()


for f in br.forms():
   print 'this is a form'
   print f

br.select_form('searchoptionB')
br.form['ApplNo'] = '018780'
html = br.submit(name = 'Search_Button')

print html.geturl()

打印表单输出为:

<searchoptionB POST http://www.accessdata.fda.gov/scripts/cder/drugsatfda/index.cfm application/x-www-form-urlencoded
  <HiddenControl(fuseaction=Search.SearchAction) (readonly)>
  <HiddenControl(SearchType=AddlSearch) (readonly)>
  <HiddenControl(SearchOption=B) (readonly)>
  <TextControl(ApplNo=)>
  <SubmitControl(Search_Button=Submit) (readonly)>
  <SubmitControl(clearcriteria=Clear) (readonly)>>

抱歉这篇长篇文章; p

1 个答案:

答案 0 :(得分:0)

UPD 关于您的评论。这是我的测试文件:

#!/usr/bin/env python
import mechanize
import cookielib

br = mechanize.Browser()
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
br.addheaders = [('User-agent', 'Mozilla/6.0 (X11; U; i686; en-US; rv:1.9.0.1) Gecko/2008071615 OS X 10.2 Firefox/3.0.1')]

fda_url2 = 'http://www.accessdata.fda.gov/scripts/cder/drugsatfda/index.cfm?fuseaction=Search.Addlsearch_drug_name'

print br.open(fda_url2).geturl()


for f in br.forms():
   print 'this is a form'
   print f

br.select_form('searchoptionB')
br.form['ApplNo'] = '018780'
html = br.submit()

print br.response().read()

这就是我在运行它时得到的结果:

$ ./test.py  | grep HUM
            <td valign="top" class="product_table" height="24"><a href="index.cfm?fuseaction=Search.Overview&DrugName=HUMULIN%20R">
 HUMULIN R
 INSULIN RECOMBINANT HUMAN
            <td valign="top" class="product_table" height="24"><a href="index.cfm?fuseaction=Search.Overview&DrugName=HUMULIN%20R%20PEN">
 HUMULIN R PEN
 INSULIN RECOMBINANT HUMAN

也许您以某种方式更改了脚本或查询其他页面?


您是否尝试在浏览器中提交此表单?

如果我导航到this URL,请使用“018780”填写“选项B”并点击“提交”,浏览器确实会将我重定向到http://www.accessdata.fda.gov/scripts/cder/drugsatfda/index.cfm,其中包含搜索结果。

尝试将其添加到代码段的末尾:

print br.response().read()

这将输出页面的HTML,并且它确实包含预期的搜索结果。

  

我看到第二个网址不包含我的查询文字,这是否意味着我需要Cookie?如果是这样,怎么样?

此表单通过POST发送,在这种情况下,所有参数都嵌入在请求正文中(RFC 2616)。