使用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
相关产品推荐
相关产品推荐

