Python request-html с селектором выпадающего списка
Я выполняю очистку на сайте, который содержит сценарий Java для извлечения данных и раскрывающийся список ввода. Я использую запрос-HTML, чтобы иметь дело с частью Java, но я изо всех сил, чтобы выбрать значение в раскрывающемся списке.
Вот мой код:
import requests_html
import bs4
url = 'https://www.cmegroup.com/trading/interest-rates/stir/eurodollar_quotes_settlements_futures.html'
params = {'tradeDate':'01/15/2019'}
session = requests_html.HTMLSession()
r = session.get(url, params=params)
r.html.render()
soup = bs4.BeautifulSoup(r.html.html, 'lxml')
r.session.close()
x = soup.body.find('select', attrs={'id':'cmeTradeDate'})
Вывод bs4.element.tag:
<select class="cmeSelect" id="cmeTradeDate" name="tradeDate" style="width: 268px; padding-right: 60px;"><option selected="" value="01/16/2019">Wednesday, 16 Jan 2019 (Final)</option> option value="01/15/2019">Tuesday, 15 Jan 2019 (Final)</option><option value="01/14/2019">Monday, 14 Jan 2019 (Final)</option><option value="01/11/2019">Friday, 11 Jan 2019 (Prelim)</option><option value="01/10/2019">Thursday, 10 Jan 2019 (Final)</option></select>
Как видите, выбранное значение в раскрывающемся списке - 16 января, хотя я указал 15-е. Фьючерсные данные в основной таблице также за 16-е.
Код для извлечения таблицы был красивым и простым с пандами:
pd.read_html(r.html.html, attrs={'id':'settlementsFuturesProductTable'})[0]
Как я могу выбрать дату из опций перед извлечением HTML?
(Кроме того, обратите внимание, если бы запрос-html мог сделать то же самое, что и для BeautifulSoup, то я хотел бы знать, как.)
1 ответ
Вы правы, что страница, с которой вы взаимодействуете, в значительной степени зависит от JavaScript, который requests
не оценивает. Переходя tradeDate
как GET
Параметр ничего не делает с этим конкретным сайтом. Вам лучше взаимодействовать с конечной точкой, из которой он извлекает данные, следующим образом:
import json
import requests
url = 'https://www.cmegroup.com/CmeWS/mvc/Settlements/Futures/Settlements/1/FUT'
r = json.loads(requests.get(url, params={
'strategy': 'DEFAULT',
'tradeDate': '01/15/2019',
'pageSize': '500'
}).text)
print(f"tradeDate: {r['tradeDate']}")
for settlement in r['settlements']:
print(settlement)
Результат:
tradeDate: 01/15/2019
{'month': 'FEB 19', 'open': '97.2875', 'high': '97.3025', 'low': '97.2875', 'last': '97.2975', 'change': '+.0125', 'settle': '97.2975', 'volume': '80,470', 'openInterest': '216,090'}
{'month': 'MAR 19', 'open': '97.3100', 'high': '97.3250', 'low': '97.3000', 'last': '97.3150', 'change': '+.0150', 'settle': '97.3200', 'volume': '239,375', 'openInterest': '1,440,528'}
{'month': 'APR 19', 'open': '97.3050', 'high': '97.3250', 'low': '97.3000', 'last': '97.3200', 'change': '+.0150', 'settle': '97.3200', 'volume': '17,317', 'openInterest': '41,199'}
...