python mechanize 提交表单后跳回首页

1 投票
1 回答
1247 浏览
提问于 2025-04-17 13:48

我有一个用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)。

撰写回答