Как получить нужные данные с сайта
Мне необходимо получать нужные значения "Индекс экономических настроений (ZEW)" с сайта. Пробую распечатать дочерние элементы, данные значения появляются, но с другой ненужной информацией. Как я понимаю мне нужно получить нужный тег и извлечь из него данные. BeautifulSoup не так давно изучаю. Как искать нужную строку?
import time
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
cap = DesiredCapabilities().FIREFOX
url = "https://ru.investing.com/economic-calendar/zew-economic-sentiment-310"
driver = webdriver.Firefox(capabilities=cap)
driver.get(url)
time.sleep(1)
soup = driver.page_source
soup = BeautifulSoup(soup, 'lxml')
quotes = soup.find_all('tbody')
for i in range(0, len(quotes)):
print("номер элемента=", i, quotes[i].text)
Ответы (3 шт):
Не хотелось возиться с селениумом, тем более, все-равно вопрос про BeautifulSoup
Добавил пример извлечения строк из таблицы
Пример:
import requests
from bs4 import BeautifulSoup
def get_text(node) -> str:
return node.get_text(strip=True) if node else ''
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0',
}
rs = requests.get('https://ru.investing.com/economic-calendar/zew-economic-sentiment-310', headers=headers)
root = BeautifulSoup(rs.content, 'html.parser')
for tr in root.select('#eventHistoryTable310 > tbody > tr'):
tds = tr.select('td')
td_date, td_time, td_fact, td_prog, td_pred, _ = tds
print(get_text(td_date), get_text(td_time), get_text(td_fact), get_text(td_prog), get_text(td_pred))
Консоль:
11.05.2021 (май) 12:00 84,0 66,3
13.04.2021 (апр) 12:00 66,3 74,0
16.03.2021 (мар) 13:00 74,0 69,6
16.02.2021 (фев) 13:00 69,6 58,3
19.01.2021 (янв) 13:00 58,3 54,4
08.12.2020 (дек) 13:00 54,4 37,5 32,8
Как вариант, в дополнение к ответу gil9red:
import requests
from bs4 import BeautifulSoup
url = 'https://ru.investing.com/economic-calendar/zew-economic-sentiment-310'
headers = {'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'}
r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.content, 'html.parser')
zew_data = soup.find('div', class_='historyTab')
rows = zew_data.find_all('tr')
for row in rows[1:]:
tds = row.find_all('td')
date = tds[0].text
time = tds[1].text
fact = tds[2].text
forecast = tds[3].text
previous = tds[4].text
print(f'{date:20} {time:7} {fact:7} {forecast:7} {previous:7}')
выведет:
11.05.2021 (май) 12:00 84,0 66,3
13.04.2021 (апр) 12:00 66,3 74,0
16.03.2021 (мар) 13:00 74,0 69,6
16.02.2021 (фев) 13:00 69,6 58,3
19.01.2021 (янв) 13:00 58,3 54,4
08.12.2020 (дек) 13:00 54,4 37,5 32,8
Ещё проще использовать Pandas, в случае, если порядок следования таблиц на странице жёстко задан и не меняется:
import pandas as pd
import requests
headers = {'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'}
url = 'https://ru.investing.com/economic-calendar/zew-economic-sentiment-310'
r = requests.get(url, headers=headers)
df = pd.read_html(r.content, thousands=None, decimal=',')
df[0]
Вывод:
Дата выпуска Время Факт. Прогноз Пред. Unnamed: 5
0 11.05.2021 (май) 12:00 84.0 NaN 66.3 NaN
1 13.04.2021 (апр) 12:00 66.3 NaN 74.0 NaN
2 16.03.2021 (мар) 13:00 74.0 NaN 69.6 NaN
3 16.02.2021 (фев) 13:00 69.6 NaN 58.3 NaN
4 19.01.2021 (янв) 13:00 58.3 NaN 54.4 NaN
5 08.12.2020 (дек) 13:00 54.4 37.5 32.8 NaN
Запрос через requests я подрезал у gil9red, уважаемого. Pandas и сама умеет читать из url напрямую, но на данном сайте видимо требуются заголовки, поэтому приходится через requests.
