使用BeautifulSoup爬取联邦公报数据并生成pandas DataFrame问题求助
问题解决指南:联邦公报搜索结果多页爬虫+DataFrame导出
问题1:DataFrame赋值清空爬取结果的解决
- 原有代码的核心问题:你先把爬取结果存入了名为
data的列表,最后一行直接执行data=pd.DataFrame(),相当于把data变量重新赋值为空白DataFrame,原有列表内容直接被覆盖,所以看起来被清空。 - 正确逻辑:先按行存储每条结果的三个字段为字典/子列表,再统一传入DataFrame构造函数,同时指定列名即可保留全部数据。
问题2:多页URL规则适配
- 该网站支持直接给第一页加
&page=1参数,不需要单独区分第一页和后续页的URL格式,直接循环构造带页码的URL即可,不需要手动写死URL列表。
修正后完整可运行代码
import requests import pandas as pd from bs4 import BeautifulSoup as bs # 基础配置 base_url = 'https://www.federalregister.gov/documents/search?conditions%5Bpublication_date%5D%5Bgte%5D=08%2F28%2F2021&conditions%5Bterm%5D=economy' headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'} # 要爬取的总页数,可自行修改数值 total_pages = 5 result_list = [] for page in range(1, total_pages+1): # 构造当前页URL,统一加page参数 current_url = f"{base_url}&page={page}" resp = requests.get(current_url, headers=headers) soup = bs(resp.text, 'html.parser') # 先定位到每条搜索结果的父容器,避免字段错位 items = soup.select('div.document-wrapper') for item in items: # 分别提取三个字段,加strip清除多余空白 title = item.find('h5').get_text(strip=True) author = item.select_one('p.document-type-agency').get_text(strip=True) date = item.select_one('p.publication-date').get_text(strip=True).replace('Published ', '') # 存入结果列表 result_list.append({ 'Title': title, 'Author': author, 'Date': date }) # 直接把结果列表转DataFrame df = pd.DataFrame(result_list) # 可查看前几行验证格式 print(df.head()) # 可选导出为本地csv文件 # df.to_csv('federal_register_economy.csv', index=False, encoding='utf-8-sig')
关键优化点说明
- 放弃了原来通过全局下标提取标题、作者的逻辑,改为先定位单条结果的父容器,再从父容器内提取对应字段,完全避免不同字段数量不匹配导致的错位问题
- 统一的URL构造逻辑,不需要单独处理第一页,修改
total_pages参数即可调整爬取页数 - 最终输出的DataFrame完全匹配你需要的
Title/Author/Date三列格式
内容的提问来源于stack exchange,提问作者user2813606
相关产品推荐
相关产品推荐

