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

如何提取HTML中每个href对应行数据并生成Pandas DataFrame

解决BMV网站表格数据抓取并生成Pandas DataFrame的问题

当然可以实现需求,当前代码返回空DataFrame的核心原因是元素定位错误或未处理动态渲染数据,以下是具体解决思路和代码示例:

问题核心排查

  1. 若直接用requests爬取返回空,大概率是目标表格由JavaScript动态加载,静态HTML中无数据
  2. 若已定位表格但无数据,说明选择器(class/id)未匹配到正确的表格或行元素

解决方案

情况1:表格为静态渲染(直接在HTML中加载)

import pandas as pd
import requests
from bs4 import BeautifulSoup

# 请求网站,添加请求头模拟浏览器
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"}
url = "https://www.bmv.com.mx/es/mercados/capitales"
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, "html.parser")

# 定位底部目标表格(需替换为实际表格的class,可通过F12开发者工具查看)
target_table = soup.find("table", class_="tabla-consolidada")
if not target_table:
    print("未找到目标表格,请检查选择器")
else:
    # 提取表头
    headers = [th.get_text(strip=True) for th in target_table.find("thead").find_all("th")]
    # 提取包含href的行数据
    rows_data = []
    for tr in target_table.find("tbody").find_all("tr"):
        # 检查行内是否存在带href的链接
        link_tag = tr.find("a", href=True)
        if link_tag:
            # 提取该行所有单元格文本
            row_content = [td.get_text(strip=True) for td in tr.find_all("td")]
            # 追加链接地址到行数据(可根据需求决定是否保留)
            row_content.append(link_tag["href"])
            rows_data.append(row_content)
    
    # 生成DataFrame,追加"链接"字段到表头
    df = pd.DataFrame(rows_data, columns=headers + ["链接"])
    print(df.head())

情况2:表格为动态渲染(JavaScript加载)

若静态爬取不到数据,用Selenium模拟浏览器加载完整页面:

import pandas as pd
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

url = "https://www.bmv.com.mx/es/mercados/capitales"
# 初始化浏览器(需提前安装对应浏览器驱动)
driver = webdriver.Chrome()
driver.get(url)

# 等待表格加载完成(替换为实际表格的class)
wait = WebDriverWait(driver, 15)
target_table = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "tabla-consolidada")))

# 提取表头
headers = [th.text.strip() for th in target_table.find_elements(By.TAG_NAME, "th")]
# 提取含href的行数据
rows_data = []
for tr in target_table.find_elements(By.TAG_NAME, "tr"):
    link_tags = tr.find_elements(By.TAG_NAME, "a")
    if link_tags:
        row_content = [td.text.strip() for td in tr.find_elements(By.TAG_NAME, "td")]
        row_content.append(link_tags[0].get_attribute("href"))
        rows_data.append(row_content)

# 生成DataFrame
df = pd.DataFrame(rows_data, columns=headers + ["链接"])
print(df.head())
driver.quit()

关键注意事项

  • 必须通过**开发者工具(F12)**确认目标表格的准确class/id,替换代码中的选择器
  • 若网站有反爬限制,可在请求头中添加更多浏览器标识,或在Selenium中启用无头模式
  • 确保每行单元格数量与表头字段数匹配,避免DataFrame列对齐错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 04:20:13