2

Beautiful Soup を使用してページをスクレイピングしようとしています。

このチュートリアルに従おうとしています。

株式ティッカー シンボルを送信した後、次のページのコンテンツを取得しようとしています。

http://www.cboe.com/delayedquote/quotetable.aspx

チュートリアルは「GET」メソッドのページ用で、私のページは「POST」です。それが問題の一部なのだろうか?

最初のテキスト ボックスを使用します。

「遅延相場については、下に株式または指数記号を入力してください。」</p>

関連コード:

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の束です。

前もって感謝します!

4

1 に答える 1

2

わかりました-問題を理解したと思います(そして別の問題を見つけました)。「urllib2」から「mechanize」に切り替えることにしました。残念ながら、データを取得する際に問題が発生し続けました。最後に、「送信」ボタンが 2 つあることに気付いたので、フォームの送信時に name パラメータを渡してみました。正しい応答を得る限り、それはトリックを行いました。

しかし、次の問題は、BeautifulSoup で HTML を解析して必要なタグを見つけることができなかったことです。Google で簡単に検索したところ、同様の問題を抱えている他のユーザーが見つかりました。それで、私は 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"
于 2012-08-06T23:29:20.440 に答える