我正在使用 Beautiful Soup 尝试抓取页面。
我正在尝试遵循这个教程。
我在提交股票代码后尝试获取以下页面的内容:
http://www.cboe.com/delayedquote/quotetable.aspx
本教程针对的是“GET”方法的页面,我的页面是“POST”方法。 我想知道这是否是问题的一部分?
我想使用第一个文本框 - 在它下面:
“在下面输入股票或指数代码以获取延迟报价。”
相关代码:
user_agent = 'Mozilla/5 (Solaris 10) Gecko'
headers = { 'User-Agent' : user_agent }
values = {'ctl00$ctl00$AllContent$ContentMain$ucQuoteTableCtl$txtSymbol' : 'IBM' }
data = urllib.urlencode(values)
request = urllib2.Request("http://www.cboe.com/delayedquote/quotetable.aspx", data, headers)
response = urllib2.urlopen(request)
调用不会失败,我不会像交互运行页面一样返回一组选项和价格。 我一堆乱码的HTML。
提前致谢!
好的 - 我想我找到了问题所在(并且发现了另一个问题)。 我决定从“urllib2”切换到“mechanize”。 不幸的是,我在获取数据时一直遇到问题。 最后,我意识到有两个“提交”按钮,因此我尝试在提交表单时传递名称参数。 就获得正确响应而言,这已经成功了。
但是,下一个问题是我无法让 BeautifulSoup 解析 HTML 并找到必要的标签。 谷歌的简短搜索显示其他人也有类似的问题。 所以,我放弃了 BeautifulSoup,只是在 HTML 上做了一个基本的正则表达式。 不像 BeautifulSoup 那样优雅,但有效。
好吧——说得够多了。 这是我想到的:
import mechanize
import re
br = mechanize.Browser()
url = 'http://www.cboe.com/delayedquote/quotetable.aspx'
br.open(url)
br.select_form(name='aspnetForm')
br['ctl00$ctl00$AllContent$ContentMain$ucQuoteTableCtl$txtSymbol'] = 'IBM'
# here's the key step that was causing the trouble - pass the name parameter
# for the button when calling submit
response = br.submit(name="ctl00$ctl00$AllContent$ContentMain$ucQuoteTableCtl$btnSubmit")
data = response.read()
match = re.search( r'Bid</font><span> \s*([0-9]{1,4}\.[0-9]{2})', data, re.MULTILINE|re.M|re.I)
if match:
print match.group(1)
else:
print "There was a problem retrieving the quote"