Python网页爬取:美国国会法案数据无法正确写入CSV的修复咨询
修复国会法案数据爬取的CSV写入异常问题
看起来你遇到的核心问题是法案编号和提案人信息没有一一绑定,代码里分开遍历了两类元素,导致数据对应关系完全混乱。另外还有变量未初始化、重复写入、逻辑漏洞等小问题,我来一步步帮你修复:
问题根源分析
- 你先遍历所有提案人信息并写入一次,再遍历所有法案编号又写入一次,这就导致两组数据完全脱节,要么重复用同一个提案人,要么重复用同一个法案编号。
secondindex和index变量没有初始化,运行时会直接报错。- 党派判断逻辑有漏洞:如果提案人名称里同时包含R/D,或者都不包含,
Party的值会出错或保持上一次的结果。 - 存在重复写入CSV的逻辑,导致数据行混乱。
修复后的代码
import csv import requests from bs4 import BeautifulSoup # 假设你的headers已经定义过了,示例UA可根据实际情况替换 headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"} with open('115congress.csv', 'w', newline='', encoding='utf-8') as f: fwriter = csv.writer(f, delimiter=';') # 写入表头 fwriter.writerow(['SPONS', 'PARTY', 'NBILL']) for page_num in range(1, 114): hrurl = f'https://www.congress.gov/search?q=%7B%22source%22%3A%22legislation%22%2C%22congress%22%3A%22115%22%2C%22type%22%3A%22bills%22%7D&page={page_num}' hrpage = requests.get(hrurl, headers=headers) soup = BeautifulSoup(hrpage.text, 'lxml') # 遍历每个法案条目,把编号和提案人信息绑定在一起 for result_item in soup.find_all('div', class_='search-result-item'): # 获取法案编号 bill_heading = result_item.find('span', class_='result-heading') if not bill_heading: continue bill_link = bill_heading.find_next('a') bill_num = bill_link.text.strip() if bill_link else 'N/A' # 获取提案人及党派 sponsor_info = result_item.find('span', class_='result-item') if not sponsor_info: continue sponsor_link = sponsor_info.find('a', target='_blank') sponsor_name = sponsor_link.text.strip() if sponsor_link else 'N/A' # 修正党派判断逻辑,精准匹配括号内的党派标识 if '(R)' in sponsor_name: party = 'Republican' elif '(D)' in sponsor_name: party = 'Democratic' else: party = 'Unknown' # 写入完整的一组数据 fwriter.writerow([sponsor_name, party, bill_num]) print(f"已写入: {sponsor_name} | {party} | {bill_num}")
关键修复点说明
- 绑定数据对应关系:不再分开遍历提案人和法案编号,而是针对每个
search-result-item(单个法案条目)同时提取编号和提案人信息,确保每组数据一一对应。 - 初始化与容错处理:增加了空值判断,避免因为页面结构变化导致的报错,同时给无法识别的党派设置默认值
Unknown。 - 简化索引逻辑:去掉了冗余的
secondindex和index判断,直接通过元素的父子/兄弟关系定位目标内容,更可靠。 - 规范变量命名:使用更清晰的变量名,避免大小写混淆导致的值覆盖问题。
- 优化写入逻辑:每个法案条目只写入一次CSV,不会产生重复或缺失的字段。
内容的提问来源于stack exchange,提问作者user11754111
相关产品推荐
相关产品推荐

