使用BeautifulSoup在多个网页上刮表



链接到表:https://home.treasury.gov/resource-center/data-chart-center/interest-rates/TextView?type=daily_treasury_yield_curve&field_tdr_date_value=all&页面=0

此表从第0页转到第27页。

我已经成功地将表刮成了第0页的pandas df:

url = 'https://home.treasury.gov/resource-center/data-chart-center/interest-rates/TextView?type=daily_treasury_yield_curve&field_tdr_date_value=all&page=0' 
page = requests.get(url)
soup = BeautifulSoup(page.text, 'lxml')
#getting the table
table = soup.find('table', {'class':'views-table views-view-table cols-20'})
headers = []
for i in table.find_all('th'):
title = i.text.strip()
headers.append(title)
df = pd.DataFrame(columns = headers)
for row in table.find_all('tr')[1:]:
data = row.find_all('td')
row_data = [td.text.strip() for td in data]
length = len(df)
df.loc[length] = row_data

现在我需要对所有页面执行同样的操作,并将其存储到一个df中

您可以使用pandas.read_html将表解析为数据帧,然后连接它们:

import pandas as pd
url = "https://home.treasury.gov/resource-center/data-chart-center/interest-rates/TextView?type=daily_treasury_yield_curve&field_tdr_date_value=all&page={}"
all_df = []
for page in range(0, 10):  # <-- increase number of pages here
print("Getting page", page)
all_df.append(pd.read_html(url.format(page))[0])
final_df = pd.concat(all_df).reset_index(drop=True)
print(final_df.tail(10).to_markdown(index=False))
>>td style="text align:right">nanan align:right;">1.66
日期20年30年外推因子8周银行折扣th style="text align=right;">52周银行折扣COUPON等效。1个月3 Yr5 Yr7年10年20年30年
2001年12月13日nannan/td>1.69nan1.695.815.53
2001年12月14日nannan1.7nan1.735.895.59
2001年12月17日nannan1.72nan1.745.915.61
2001年12月18日nannan1.72nan1.715.815.52
2001年12月19日nannan1.69nan1.695.735.45
2001年12月20日nannannannan align:right;">1.67nan1.695.73>5.43
2001年12月21日nan1.67nan1.715.765.45
2001年12月24日nannannannannan1.725.815.49
2001年12月26日nannan1.77nan1.755.845.52
2001年12月27日nan1.75nan1.745.785.49

最新更新