排查Python HTML转CSV爬虫无输出问题
排查CSV写入空文件的核心问题
结合你提供的代码和描述,单独测试模块正常但集成后无输出,大概率是流程中某一步静默跳过了数据写入逻辑,下面是针对性的排查方向和修改建议:
1. 先加调试打印,定位卡壳环节
在关键步骤添加打印,直接看哪一步没执行或返回空:
import csv from urllib.parse import urljoin import os def main(base_url, query_string): processed_urls = set() main_url = base_url + query_string main_page_content = fetch_page_content(main_url) csv_file = "my_actual_path" # 确认CSV文件实际路径,避免找错文件 print(f"CSV实际路径: {os.path.abspath(csv_file)}") with open(csv_file, mode='w', newline='', encoding='utf-8-sig') as file: writer = csv.writer(file, delimiter=',') writer.writerow(['registered', 'envelopes', 'valid']) print("已写入CSV表头") if main_page_content: print(f"主页面内容长度: {len(main_page_content)}") all_links = parse_links(main_page_content) print(f"主页面提取到{len(all_links)}个链接") for idx, a_tag in enumerate(all_links): href = a_tag.get('href') print(f"处理第{idx+1}个链接: {href}") if href and not href.startswith('http'): # 用urljoin替代手动拼接,避免相对路径错误(比如../开头的链接) full_url = urljoin(base_url, href) print(f"解析后完整URL: {full_url}") if full_url not in processed_urls: processed_urls.add(full_url) result = extract_table_data(full_url, processed_urls, base_url) print(f"从{full_url}提取到{len(result)}条数据") for record in result: try: writer.writerow([record['volici_v_seznamu'], record['vydane_obalky'], record['platne_hlasy']]) print(f"已写入数据: {record}") except KeyError as e: print(f"数据缺失键{e}: {record}") else: print(f"跳过链接: 空链接或绝对URL") else: print("主页面内容获取失败") print(f"数据写入完成,路径: {csv_file}")
2. 重点排查几个高频问题
(1)链接解析错误
你手动拼接相对URL的逻辑f"{base_url.rstrip('/')}/{href.lstrip('/')}"无法处理../开头的上级目录路径,会生成无效URL,导致extract_table_data拿不到数据。改用urljoin可以彻底解决这个问题。
(2)extract_table_data参数干扰
你单独测试解析函数时,是否传了processed_urls和base_url这两个额外参数?如果函数内部逻辑依赖这两个参数做递归或过滤,可能导致返回空列表。
(3)parse_links返回空列表
虽然单独测试解析正常,但主页面的结构可能和你测试时的页面不一致,导致parse_links没提取到任何<a>标签。通过打印len(all_links)可以直接确认。
(4)CSV路径错误
你写的my_actual_path可能是相对路径,实际写入的文件不在你预期的目录下。打印绝对路径可以验证这一点。
3. 额外注意点
- 如果
extract_table_data返回的是单个字典而非列表,for record in result会遍历字典的键,直接触发KeyError,导致数据无法写入。 - 确认
fetch_page_content在主脚本中是否携带了正确的请求头(比如User-Agent),有些网站会拦截无标识的请求,返回空内容但不抛异常。
内容的提问来源于stack exchange,提问作者Radim Šoukal
相关产品推荐
相关产品推荐

