Если вы проверите свой html-ответ (суп), вы увидите, что тег таблицы, который вы получаете в этой строке table_regions = soup.find('table', {'class': "t4"})
, закрывается перед строками, которые содержат необходимую вам информацию (те, которые содержат тд с именами классов). : вверх дн d1 и s1.
Так как насчет использования сырых тд тегов, таких как:
from bs4 import BeautifulSoup as bs4
import requests
import pandas as pd
url = 'https://www.eia.gov/todayinenergy/prices.php'
r = requests.get(url)
soup = bs4(r.text, "html.parser")
a = soup.find_all('tr')
rows = []
subel = []
for tr in a[42:50]:
b = tr.find_all('td')
for td in b:
subel.append(td.string)
rows.append(subel)
subel = []
df = pd.DataFrame(rows, columns=['Region','Price_1', 'Percent_change_1', 'Price_2', 'Percent_change_2', 'Spark Spread'])
Обратите внимание, что я использую только a[42:50]
часть результатов, потому что содержит все тд сайта. Вы можете использовать остальные, если вам нужно.