Простым способом было бы сделать:
import pandas as pd
url = "https://markets.on.nytimes.com/research/markets/holidays/holidays.asp?display=market&exchange=SGO"
dfs = pd.read_html(url)
df = dfs[0]
Но это хороший пример для практики BeautifulSoup, так как он довольно чист с тегами.Вы нашли табличный тег, теперь вам просто нужно перебрать строки и поместить их в кадр данных.
сначала я инициализирую пустой кадр данных для хранения моих результатов:
results = pd.DataFrame()
Затем я нахожу все теги tr
в таблице, которую вы сохранили:
rows = table.find_all('tr')
Далее для каждой строки я нахожу данные с тегом td
и помещаю их всписок:
data = row.find_all('td')
row_data = [ x.text for x in data ]
Я помещаю это во временный фрейм данных, который я использую, чтобы добавить к исходному фрейму данных результатов:
temp_df = pd.DataFrame([row_data])
results = results.append(temp_df)
Затем в последний раз я сбрасываю нулевую строку и сбрасываю индекс,Я не знаю, какими должны быть столбцы, но вы можете переименовать столбцы в последней строке.Или заголовки столбцов обычно являются тегом th
таблицы, вы всегда можете вернуться и получить их.
Полный код:
from bs4 import BeautifulSoup
import requests
import pandas as pd
url = "https://markets.on.nytimes.com/research/markets/holidays/holidays.asp?display=market&exchange=SGO"
r = requests.get(url)
data = r.text
soup = BeautifulSoup(data, "lxml")
table = soup.find_all('table')[0]
results = pd.DataFrame()
rows = table.find_all('tr')
for row in rows:
data = row.find_all('td')
row_data = [ x.text for x in data ]
temp_df = pd.DataFrame([row_data])
results = results.append(temp_df)
results = results.dropna(how='all').reset_index(drop = True)
results.columns = ['col1', 'col2', 'col3', 'col4']