python 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
我发现第二个网址没有包含我的查询内容,这是不是意味着我需要使用cookies?如果是的话,我该怎么做呢?
这是我的代码片段:
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
更新 关于你的评论。这是我的测试文件:
#!/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
也许你不小心改动了你的脚本,或者查询了不同的页面?
你试过在浏览器中提交这个表单吗?
如果我访问 这个链接,在“选项B”里填上“018780”,然后点击“提交”,浏览器确实会把我重定向到 http://www.accessdata.fda.gov/scripts/cder/drugsatfda/index.cfm,这个页面里有搜索结果。
试着在你的代码片段末尾加上这个:
print br.response().read()
这样会输出页面的HTML内容,确实包含了预期的搜索结果。
我看到第二个链接里没有我的查询文本,这是不是意味着我需要使用cookies?如果是的话,怎么做?
这个表单是通过POST方式发送的,在这种情况下,所有参数都嵌入在请求体中(RFC 2616)。