다음 코드를 사용하려고합니다. 하지만 첫 번째 선택한 날짜와 같은 데이터의 5 배가됩니다.MechanicalSoup에서 선택한 데이터를 catch하지 않습니다.
import re
import datetime
import mechanicalsoup
def get_EminiTable(soup):
allValues = []
colnames = soup.find('thead').get_text()
allValues.append([i for i in colnames.split('\n') if len(i) > 1])
lnr = 0
for line in soup.tbody.find_all('tr'):
allValues.append([i for i in line.get_text().split('\n') if len(i) > 0])
if 'UNCH' in allValues:
allValues.pop()
if lnr > 1: break
lnr += 1
return allValues
def get_settldays(soup):
settlDays = soup.find('select', id="cmeTradeDate").get
settlDays = re.findall('\d\d/\d\d/\d\d\d\d',str(settlDays))
return [datetime.datetime.strptime(adat, '%m/%d/%Y') for adat in settlDays]
url = "http://www.cmegroup.com/trading/equity-index/us-index/e-mini-sandp500_quotes_settlements_futures.html"
browser = mechanicalsoup.StatefulBrowser()
if str(browser.open(url)) != '<Response [200]>':
print('Error')
quit()
soup = browser.get_current_page()
settlDays = get_settldays(soup)
for adate in settlDays:
form = browser.select_form('form[id="quotesoptionsform1"]')
form.set("tradeDate",adate.__format__('%m/%d/%Y'))
browser.submit_selected()
soup = browser.get_current_page()
tabvals = get_EminiTable(soup)
print(adate)
for each in tabvals:
print(each)
browser.session.close()
browser.close()
다른 테이블의 올바른 날짜를 얻으려는 아이디어이거나 mechanicalsoup의 버그입니다.
Daniel 많은 설명에 감사드립니다. 당신이 말했듯이 나는 Selenium으로 시도했다. 잘 작동합니다! – alexcape