使用 BeautifulSoup 抓取第一个表时出现 HTTP 错误 404,但第二个表工作正常

问题描述 投票:0回答:1

我正在编写一个 Python 脚本,使用 BeautifulSoup 从 Investing.com 抓取历史 CDS 数据。目标是从页面上的特定表中提取数据并将其编译成 DataFrame。

这是我的代码的核心部分:

lista_cds = ['cds-1-year', 'cds-2-year', 'cds-3-year',
         'cds-4-year', 'cds-5-year', 'cds-7-year', 'cds-10-year']

headers = {'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, 
like Gecko) Chrome/106.0.0.0 Safari/537.36'}

lista_dfs = []

for ano_cds in lista_cds:

   url = f'https://br.investing.com/rates-bonds/brazil-{ano_cds}-usd-historical-data'

   req = Request(url, headers=headers)
   page = urlopen(req)
   soup = BeautifulSoup(page, features='lxml')

   
   table = soup.find_all("table")[0]

   df_cds = pd.read_html(StringIO(str(table)))[0][['Último', 'Data']]

问题:当我尝试从第一个表 (tables[0]) 中抓取数据时,我收到 HTTP 错误 404:未找到。然而,当我切换到第二个表(tables[1])时,代码工作得很好,但这不是我需要的表。

有趣的是,其他人运行了完全相同的代码,针对表 [0],并且它对他们来说非常有效。这让我相信问题可能不在于代码本身,而可能与特定环境或服务器的特殊响应有关。

但我不确定这个人是否在撒谎或其他什么。

我的环境:

  • Vscode
  • Python版本:3.11.5
  • Windows 11
python beautifulsoup python-requests finance
1个回答
0
投票

您的

lista_cds
值有误,除了
years
之外的所有元素都应该是
year
而不是
cds-1-year

您也可以直接使用

pandas.read_html
,无需urllib/BeautifulSoup。

试试这个代码:

import pandas as pd 

lista_cds = ['cds-1-year', 'cds-2-years', 'cds-3-years', 'cds-4-years', 'cds-5-years', 'cds-7-years', 'cds-10-years']
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36'}

url = 'https://br.investing.com/rates-bonds/brazil-{}-usd-historical-data'
lista_dfs = [pd.read_html(url.format(ano_cds), storage_options=headers)[0][['Último', 'Data']] for ano_cds in lista_cds]

print(lista_dfs)
© www.soinside.com 2019 - 2024. All rights reserved.