网页爬取结果导入Pandas DataFrame并导出Excel的代码优化问询
批量爬取网页数据存入Pandas DataFrame并导出Excel解决方案
问题说明
需要遍历结构一致的多个网页,提取<dt>标签作为列标题、<dd>标签作为行数据,存入Pandas DataFrame后导出至Excel。现有代码使用transpose操作逻辑不够直观,同时发现表格字段类型为object而非预期的string,需确认问题并优化。
现有代码的问题
- 每次循环用
pd.concat拼接DataFrame,效率低下且代码冗余 - 通过
transpose转换行列结构属于绕弯写法,逻辑不直观 - 未处理数据首尾空格,可能引入无效字符
- 未统一设置
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
相关产品推荐
相关产品推荐

