用美丽的汤刮痧页面的问题

时间:2012-08-03 12:45:17

标签: python-2.7 screen-scraping web-scraping beautifulsoup

我正在使用Beautiful Soup尝试刮一页。

我正在尝试关注this教程。

我在提交股票代码符号后试图获取以下页面的内容:

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。

提前致谢!

1 个答案:

答案 0 :(得分:2)

好的 - 我想我发现了问题(并找到了另一个问题)。我决定从'urllib2'切换到'机械化'。不幸的是,我在获取数据时遇到了问题。最后,我意识到有两个“提交”按钮,所以我在提交表单时尝试传递name参数。就获得正确答案而言,这就成功了。

然而,下一个问题是我无法让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>&nbsp;\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"