парсинг курса доллара и евро

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

import requests
from bs4 import BeautifulSoup

URL = "https://www.fontanka.ru/currency.html"
HEADERS = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0", "accept": "*/*"}

def parse_rate():
    html = requests.get(URL, headers=HEADERS, params=None)
    soup = BeautifulSoup(html.text, "html.parser")
    if html.status_code == 200:
        #items = soup.find_all("table", class_="J-af9")
        items = soup.find_all("tbody", class_="J-agb")
        rates = []
        for i in items:
            rates.append({
                "str": i.find("td", class_="J-d3").get_text(),
                "val": i.find("td", class_="J-agl").get_text()
            })
        print(rates)
    else:
        print("Ошибка: " + str(html.status_code))

parse_rate()

Выводит только: [{'str': 'Доллар США', 'val': '70.97'}]


Ответы (1 шт):

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

Таблички лучше парсить через Pandas, а не "вручную":

import pandas as pd

url = "https://www.fontanka.ru/currency.html"
df = pd.read_html(url)[0]
print(df.loc[df['Валюта'].isin(['usd','eur']), ['Валюта','Курс']])

Вывод:

  Валюта   Курс
0    usd  70.97
1    eur  82.68

Вариант с выводом на печать в нужном формате:

df.loc[df['Валюта'].isin(['usd','eur']), ['Валюта.1','Курс']].apply(lambda x: print(f'{x[0]}: {x[1]}'), axis=1);

Вывод:

Доллар США: 71.06
Евро: 82.62
→ Ссылка