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

网页爬取结果导入Pandas DataFrame并导出Excel的代码优化问询

批量爬取网页数据存入Pandas DataFrame并导出Excel解决方案

问题说明

需要遍历结构一致的多个网页,提取<dt>标签作为列标题、<dd>标签作为行数据,存入Pandas DataFrame后导出至Excel。现有代码使用transpose操作逻辑不够直观,同时发现表格字段类型为object而非预期的string,需确认问题并优化。

现有代码的问题

  1. 每次循环用pd.concat拼接DataFrame,效率低下且代码冗余
  2. 通过transpose转换行列结构属于绕弯写法,逻辑不直观
  3. 未处理数据首尾空格,可能引入无效字符
  4. 未统一设置ignore_index,易导致索引混乱

优化后的代码

import requests
import pandas as pd
from bs4 import BeautifulSoup

# 初始化存储所有数据的列表
data_list = []
# 标记是否已获取表头
got_header = False
headers = []

for row in rows:
    # 获取详情页链接
    QA_link = row.find('td', class_='views-field views-field-nothing-1').find('a', href=True)['href']
    req_QA = requests.get(QA_link)
    soup_QA = BeautifulSoup(req_QA.text, 'html.parser')
    QA_table = soup_QA.find('dl', class_='dl-horizontal SingleRulebookRecord')
    
    # 提取当前页的dt和dd元素
    dt_elements = QA_table.findAll('dt')
    dd_elements = QA_table.findAll('dd')
    
    # 第一次循环时提取并处理表头
    if not got_header:
        headers = [dt.string.strip().replace(':', '') for dt in dt_elements]
        got_header = True
    
    # 将当前页的dd数据与表头配对成字典
    row_data = {}
    for idx, header in enumerate(headers):
        # 处理数据:转字符串并去除首尾空格
        raw_value = dd_elements[idx].string
        row_data[header] = str(raw_value).strip() if raw_value else ''
    
    data_list.append(row_data)

# 一次性创建DataFrame,无需transpose和多次concat
df = pd.DataFrame(data_list)

# 可选:将所有字段转换为string类型(Pandas 1.0.0+支持)
df = df.astype('string')

# 导出到Excel,不包含索引列
df.to_excel('results.xlsx', index=False)

关于字段类型的说明

  • Pandas默认用object类型存储字符串,这是历史遗留的兼容写法,大部分场景下使用无问题
  • string类型是Pandas 1.0.0版本新增的专用字符串类型,会强制存储字符串,避免混入其他数据类型,适合需要严格数据类型校验的场景
  • 若不需要严格的字符串约束,保留object类型完全可行;若要统一转为string,直接使用df.astype('string')即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:16:20