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

使用Python BeautifulSoup解析HTML后如何按指定格式分层输出写入CSV

解决方案

你已经实现了所有目标字段的解析,仅需要将各部分解析结果临时存储后按规则组合,再调用CSV模块写入文件即可,以下是修改后的完整代码:

完整代码

import requests
import csv
from bs4 import BeautifulSoup

file_link = '替换为你的HTML文件地址'

res = requests.get(file_link)
soup = BeautifulSoup(res.text,"lxml")
# 解析全局独立字段
nature_of_asso = soup.select_one("td:contains('Nature of association') + td").get_text(strip=True)

# 解析第一个表格,存储到列表
purpose_list = []
for purpose_tr in soup.select("table:has(> tr > td:nth-of-type(1) + td:contains('Purpose')) tr")[3:]:
    try:
        purpose = purpose_tr.select_one('td:nth-of-type(2)').get_text(strip=True)
    except AttributeError:
        purpose = ""
    try:
        in_cash = purpose_tr.select_one('td:nth-of-type(3)').get_text(strip=True)
    except AttributeError:
        in_cash = ""
    purpose_list.append((purpose, in_cash))

# 解析第二个表格,存储到列表
donor_list = []
for donor_tr in soup.select("table:has(> tr > td:nth-of-type(1) + td:contains('Donor Name')) tr")[2:]:
    try:
        donor_name = donor_tr.select_one('td:nth-of-type(2)').get_text(strip=True)
    except AttributeError:
        donor_name = ""
    try:
        address = donor_tr.select_one('td:nth-of-type(3)').get_text(strip=True)
    except AttributeError:
        address = ""
    donor_list.append((donor_name, address))

# 解析第三个表格,存储到列表
country_list = []
for country_tr in soup.select("table:has(> tr > td:nth-of-type(1) + td:contains('Country Name')) tr")[1:]:
    try:
        country = country_tr.select_one('td:nth-of-type(2)').get_text(strip=True)
    except AttributeError:
        country = ""
    try:
        amount = country_tr.select_one('td:nth-of-type(3)').get_text(strip=True)
    except AttributeError:
        amount = ""
    country_list.append((country, amount))

# 写入CSV文件
max_row_count = max(len(purpose_list), len(donor_list), len(country_list))
# 用utf-8-sig编码兼容Excel打开不乱码
with open('output.csv', 'w', newline='', encoding='utf-8-sig') as f:
    csv_writer = csv.writer(f)
    # 写入表头,可根据你需要的格式调整顺序
    csv_writer.writerow(['关联性质', '用途', '现金(上期余额)', '捐赠人姓名', '地址', '国家名称', '金额'])
    for idx in range(max_row_count):
        # 取对应行数据,超出列表长度则补空
        pur_row = purpose_list[idx] if idx < len(purpose_list) else ('', '')
        don_row = donor_list[idx] if idx < len(donor_list) else ('', '')
        cou_row = country_list[idx] if idx < len(country_list) else ('', '')
        # 组合所有字段写入行
        write_row = [
            nature_of_asso,
            pur_row[0],
            pur_row[1],
            don_row[0],
            don_row[1],
            cou_row[0],
            cou_row[1]
        ]
        csv_writer.writerow(write_row)

补充说明

  • 若三个表格的行数严格一一对应,可直接用zip(purpose_list, donor_list, country_list)遍历配对,无需计算最大行数补空
  • 若不需要兼容Excel打开CSV,可将编码参数改为encoding='utf-8'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 04:54:02