You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用BeautifulSoup无法获取福布斯全球2000强网页表格求助

解决福布斯全球2000强表格爬取失败的问题

你遇到的核心问题是福布斯的Global 2000列表是通过JavaScript动态渲染的——直接用urllib.request获取的静态HTML里并没有完整的2000条公司数据,所以BeautifulSoup根本找不到你要的完整表格内容。下面给你两种可行的解决方案:

方案1:直接调用官方API(推荐,高效稳定)

福布斯的列表数据其实是通过XHR接口异步加载的,我们可以直接请求这些API获取结构化的JSON数据,比解析HTML简单得多:

  1. 先安装必要的库:
pip install requests pandas
  1. 完整代码示例:
import requests
import pandas as pd

# 初始化空DataFrame存储所有数据
all_companies = pd.DataFrame()

# 福布斯Global 2000分20页,每页100条数据
for page in range(1, 21):
    # 构造API请求URL(year参数可以根据需要修改,比如2024/2023)
    api_url = f"https://www.forbes.com/global2000/list/data?year=2024&position={page*100 - 99}&page={page}"
    
    # 发送请求,添加必要的请求头模拟浏览器
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
    }
    response = requests.get(api_url, headers=headers)
    data = response.json()
    
    # 将当前页的数据转换为DataFrame并追加到总表
    page_df = pd.DataFrame(data["listItems"])
    all_companies = pd.concat([all_companies, page_df], ignore_index=True)

# 保存结果到CSV(可选)
all_companies.to_csv("forbes_global2000_2024.csv", index=False)
print(f"成功获取{len(all_companies)}家公司数据")

方案2:用Selenium模拟浏览器加载动态内容

如果不想找API,可以用Selenium模拟真实浏览器的行为,等待页面加载完成后再提取表格:

  1. 安装依赖:
pip install selenium pandas

同时需要下载对应浏览器的驱动(比如ChromeDriver),并确保其路径能被Python识别。

  1. 代码示例:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd

# 初始化Chrome浏览器(其他浏览器配置类似)
driver = webdriver.Chrome()
driver.get("https://www.forbes.com/global2000/list/#tab:overall")

# 等待表格加载完成(最多等待10秒)
wait = WebDriverWait(driver, 10)
table = wait.until(EC.presence_of_element_located((By.TAG_NAME, "table")))

# 提取表格数据到列表
rows = table.find_elements(By.TAG_NAME, "tr")
data = []
for row in rows[1:]:  # 跳过表头行
    cols = row.find_elements(By.TAG_NAME, "td")
    row_data = [col.text.strip() for col in cols]
    data.append(row_data)

# 构造DataFrame并保存
columns = [col.text.strip() for col in rows[0].find_elements(By.TAG_NAME, "th")]
df = pd.DataFrame(data, columns=columns)

# 关闭浏览器
driver.quit()

df.to_csv("forbes_global2000_selenium.csv", index=False)
print(f"成功获取{len(df)}家公司数据")

对你原代码的几点补充说明

  • 原代码里没有导入pandas却直接用了pd.DataFrame,这会导致报错,记得加上import pandas as pd
  • 直接用urllib.request获取的HTML只有页面框架,没有实际的表格数据,所以table = soup.find_all('table')[0]要么找不到元素,要么拿到空的表格结构

内容的提问来源于stack exchange,提问作者Alexander Kalinovskiy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:29:31