因此,如果我直接访问该地址,它会重定向并加载我想要的页面,但如果我尝试使用下面的代码执行此操作,则会给出错误代码 500;
import urllib, urllib2
import sys
if len(sys.argv) > 1:
molecule = sys.argv[1]
else:
print "Error: no molecule requested"
sys.exit()
# Created handler
redirectionHandler = urllib2.HTTPRedirectHandler()
# 2 apply the handler to an opener
opener = urllib2.build_opener(redirectionHandler)
# 3. Install the openers
urllib2.install_opener(opener)
request = urllib2.Request("http://cccbdb.nist.gov/getform.asp", data=urllib.urlencode({'formula':molecule, "submit1": "Submit"}))
response = urllib2.urlopen(request)
只需执行类似的操作即可使用该程序python program.py ch4
,它会抛出错误。但是,只需访问链接就可以了;
例如http://cccbdb.nist.gov/getform.asp?formula=ch4
我想做的是在这个页面填写表格,然后加载结果页面。该页面有这个:
<FORM action="getform.asp" method=POST id=form1 >
<INPUT type="text" id=text1 name=formula
VALUE='CH4'
></P>
<INPUT type="submit" value="Submit" id=submit1 name=submit1>
</FORM>
当我将帖子数据直接提交到该页面时,它正是我想要的。当我使用 urllib2 执行此操作时,它会给出错误 500。我尝试简单地执行此操作,而不设置重定向内容,并且还尝试在获取任何内容时捕获错误并忽略它(根据另一个答案)。
$ wget http://cccbdb.nist.gov/getform.asp?formula=ch4
也不行。
如何在 python 中获取此页面的内容?
编辑:我也尝试过使用它mechanize
,我得到了同样的错误;
import mechanize
import cookielib
from BeautifulSoup import BeautifulSoup
import html2text
import sys
if len(sys.argv) > 1:
molecule = sys.argv[1]
else:
print "Error: no molecule requested"
sys.exit()
# Browser
br = mechanize.Browser()
# Cookie Jar
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
# Browser options
br.set_handle_equiv(True)
#br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
# Follows refresh 0 but not hangs on refresh > 0
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
# User-Agent (this is cheating, ok?)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
# The site we will navigate into, handling it's session
br.open('http://cccbdb.nist.gov/geom1.asp')
# Select the first (index zero) form
br.select_form(nr=0)
br.form["formula"] = molecule
br.submit()