Как ввести диапазон дат в html date-picker при просмотре с Beautifulsoup?

1

Я пытаюсь ввести пользовательский диапазон дат в виде HTML, чтобы очистить данные для данного диапазона. HTML-код выглядит следующим образом:

<div class="dateRange inlineblock datePickerBinder arial_11 lightgrayFont" 
     id="widgetFieldDateRange">03/19/2019 - 04/18/2019</div>
</div>
<input id="picker" type="hidden" value=" 03/19/2019 - 04/18/2019">

Я пробовал следующее:

import requests
import urllib.parse as urlParse

url = 'https://www.investing.com/funds/lansforsakringar-global-indexnara-historical-data'
values = {'start':'01/18/2019','end':'04/18/2019'}

# pretend to be a chrome 47 browser on a windows 10 machine
headers = {
    "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36",
    "Accept" : "text/plain, */*; q=0.01",
    "Content-Type" : "application/x-www-form-urlencoded",
    "X-Requested-With" : "XMLHttpRequest"
}

# encode values for the url
params = urlParse.urlencode(values).encode("utf-8")

# create the url
s = requests.Session()  
targetUrl = s.post(url=url, data=params, headers=headers)


# open the url
html = BeautifulSoup(targetUrl.content, "html.parser")

# read the response
print(html.prettify)

Но при печати ответа я вижу, что установлен диапазон дат по умолчанию и что мой пользовательский диапазон дат не был применен. Как мне решить эту проблему?

Нашел это также, что я верю, является javascript, который публикует дату

<script type="text/javascript">
            window.siteData = {
                htmlDirection: 'ltr',
                decimalPoint: '.' || '.',
                thousandSep: ',' || ',',
                isEu : false,
                userLoggedIn: false,
                userHasPhoneRegistered: false,
                currencyPosition: 'left',
                datepicker: {
                    applyButton: 'Apply',
                    format: 'm/d/Y',
                    formatShort: 'm/d/y',
                    formatLong: 'm/d/Y',
                    formatSend: 'yy-mm-dd',
                    firstDay: '1',
                    dayNames: ["Su","Mo","Tu","We","Th","Fr","Sa"],
                    monthNamesShort: ["Jan.", "Feb.", "Mar.", "Apr.", "May", "Jun.", "Jul.", "Aug.", "Sep.", "Oct.", "Nov.", "Dec."],
                    monthNames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
                    translations: {
                        custom: 'Custom dates',
                        start: 'Start Date',
                        end: 'End Date'
                    }
  • 0
    данные заполняются из вызова ajax по https://www.investing.com/instruments/HistoricalDataAjax с данными формы в теле запроса. загрузите страницу в браузере, откройте инспектор и измените дату. вы увидите сообщение POST на https://www.investing.com/instruments/HistoricalDataAjax с правильным телом запроса.
  • 0
    Понятно, но я не совсем понимаю смысл этого? Смоделирую ли я POST для investing.com/instruments/HistoricalDataAjax с моими параметрами?
Показать ещё 5 комментариев
Теги:
python-3.x
web-scraping
beautifulsoup

2 ответа

1
Лучший ответ

Следующее должно помочь вам выбрать меню календаря и ввести значения с помощью Selenium. На странице создан Ajax POST, но я не смог передать нужные файлы cookie (я думаю)

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

d = webdriver.Chrome()
d.get('https://www.investing.com/funds/lansforsakringar-global-indexnara-historical-data')
try:  #attempt to dismiss banners that could block later clicks
    WebDriverWait(d, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".closer"))).click()
    d.find_element_by_css_selector('.closer').click()
except:
    pass
d.find_element_by_id('widgetFieldDateRange').click() #show the date picker
sDate  = d.find_element_by_id('startDate') # set start date input element into variable
sDate.clear() #clear existing entry
sDate.send_keys('01/18/2019') #add custom entry
eDate = d.find_element_by_id('endDate') #repeat for end date
eDate.clear()
eDate.send_keys('04/18/2019')
d.find_element_by_id('applyBtn').click() #submit changes
  • 0
    Я не знаю, как это работает, но это точно работает, и это удивительно! Большое спасибо за ваше время и помощь QHarr!
  • 0
    Добавлены некоторые заметки в коде
Показать ещё 1 комментарий
0

Вы можете использовать selenium:

from selenium import webdriver
from bs4 import BeautifulSoup as soup
d = webdriver.Chrome('/path/to/chromedriver')
d.get('https://www.investing.com/funds/lansforsakringar-global-indexnara-historical-data')
r = soup(d.page_source, 'html.parser').find('div', {'id':'widgetFieldDateRange'}).text

Выход:

'03/18/2019 - 04/18/2019'
  • 0
    Спасибо за вводные данные, я не очень знаком с селеном, но на самом деле я не после печати диапазона дат, но чтобы изменить его и применить пользовательский диапазон дат, чтобы я мог просматривать результаты между различными диапазонами дат.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню