Как получить нужные данные с сайта

Мне необходимо получать нужные значения "Индекс экономических настроений (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 шт):

Автор решения: gil9red

Не хотелось возиться с селениумом, тем более, все-равно вопрос про 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
→ Ссылка
Автор решения: Jack_oS

Как вариант, в дополнение к ответу 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   
→ Ссылка
Автор решения: CrazyElf

Ещё проще использовать 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.

→ Ссылка