2012-08-03 2 views
2

나는 아름 다운 스프를 사용하여 페이지를 시도하고 긁어 모으고 있습니다.문제점 아름다운 스프로 페이지 긁기

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 묶음이다.

미리 감사드립니다.

+0

POST 대신 GET을 사용해보세요. GET을 사용하여 작동하도록 만들 수있었습니다. 방금 urlib2.urlopen()을 사용하여'? ticker = '을 URL에 추가하고 제출했습니다. 거기에서 Beautiful Soup로 결과를 파싱 할 수 있습니다. – David

+0

도와 줘서 고마워, 데이빗! 그것은 여전히 ​​나를 위해 작동하지 않습니다. 여기 내 코드는 다음과 같습니다. request = "http://www.cboe.com/delayedquote/quotetable.aspx?ticker=IBM" 응답 = urllib2.urlopen (요청) htmltext = response.read() soup = BeautifulSoup (htmltext) – dorkboy

+0

Hmmmmm ... 지난주에 시도했을 때 작동했습니다. 다른 일이 여기에 있어야합니다. 오늘 좀 더 이걸 가지고 놀아 볼게. 내가 너를 잘못 지시하면 사과해야한다. – David

답변

2

Ok - 문제를 발견하고 (다른 것을 찾은 것 같습니다.) 나는 'urllib2'에서 'mechanize'로 전환하기로 결정했다. 불행히도 계속 데이터를 가져 오는 데 문제가있었습니다. 마지막으로 두 개의 '제출'버튼이 있다는 것을 알았으므로 양식을 제출할 때 이름 매개 변수를 전달하려고했습니다. 정확한 응답을 얻는 것까지 그 트릭을했습니다.

그러나 다음 문제는 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" 
+0

David - 모든 도움에 감사드립니다 !!! – dorkboy