如何使用BeautifulSoup提取表格数据并保存为CSV文件
解决方案:提取HTML表格数据并保存为CSV
我来帮你搞定这个问题!你现在的核心问题是把三个字段分开循环提取,导致没法把同一行的公司名、分类、地址对应起来,而且写入CSV的代码也有语法错误。咱们一步步修正:
原代码的问题分析
- 三个独立的
for循环会分别遍历所有公司名、所有分类、所有地址,这样你没法把某一家公司的三个信息对应起来 - 写入CSV时,你写的是字符串
'company_name.string'而不是实际的变量值,而且最后一行代码少了闭合的括号 - 文件打开的部分有点冗余,
os.path.join生成了路径但没用到,直接用open("text.txt")可能会有路径问题
修正后的完整代码
import os import csv from bs4 import BeautifulSoup # 定义文件路径,用os.path.join确保跨平台兼容 path = "C:/Users/trond/OneDrive/Dokumente/01 Tech/01 Python" file_name = os.path.join(path, "text.txt") # 打开HTML文件并解析,用with语句自动管理文件关闭 with open(file_name, encoding="utf-8") as my_file: plain_text = my_file.read() soup = BeautifulSoup(plain_text, "html.parser") # 打开CSV文件准备写入,指定utf-8编码避免德语字符乱码,newline=''避免空行 with open('outputFile.csv', 'w', newline='', encoding='utf-8') as csv_file: csv_writer = csv.writer(csv_file) # 写入CSV表头 csv_writer.writerow(['Company Name', 'Category', 'Address']) # 定位表格中所有的公司数据行 company_rows = soup.find_all('tr', class_='wpgmaps_mlist_row') for row in company_rows: # 从当前行提取对应字段的文本内容,strip=True去除多余空格和换行 company_name = row.find('td', class_='wpgmza_table_title all').get_text(strip=True) company_category = row.find('td', class_='wpgmza_table_category').get_text(strip=True) company_address = row.find('td', class_='wpgmza_table_address').get_text(strip=True) # 打印验证数据(可选) print(f"[{company_name}] - {company_category} | {company_address}") # 将当前公司的三个字段写入CSV一行 csv_writer.writerow([company_name, company_category, company_address])
关键改进说明
- 按行提取数据:先找到每个公司对应的
<tr>行,再在每行内提取三个字段,确保数据一一对应 - 安全的文件操作:使用
with语句打开文件,自动处理文件关闭,避免资源泄漏 - 文本处理优化:用
get_text(strip=True)替代.string,能更好地处理可能存在的多余空格,同时.string在某些情况下会返回None,get_text()更可靠 - 编码与格式处理:指定
encoding='utf-8'保证德语特殊字符正常显示,newline=''避免CSV文件出现多余空行 - 语法错误修复:修正了原代码中写入CSV时的字符串错误和括号缺失问题
内容的提问来源于stack exchange,提问作者TheTresckow
相关产品推荐
相关产品推荐

