Python合并两个re.findall结果导出销售日期与地址两列数据到CSV
解决方法
核心逻辑很简单:你已经拿到了长度完全对等的日期列表d和地址列表a,只需要把两个列表按索引一一配对,逐行写入CSV即可,不需要把两个列表拼接后遍历。
下面是修改后可直接运行的完整代码:
#!/usr/bin/env python import re import requests from bs4 import BeautifulSoup import csv page = requests.get('https://salesweb.civilview.com/Sales/SalesSearch?countyId=32') soup = BeautifulSoup(page.text, 'html.parser') list_ = soup.find(class_='table-striped') list_items = list_.find_all('tr') content = list_items # 匹配原始带标签的日期、地址列表 d = re.findall(r"<td>\d*/\d*/\d+</td>",str(content)) a = re.findall(r"<td>\d*?\s.+\d+?.*</td>",str(content)) # 清理标签,得到干净的日期、地址列表 clean_dates = [re.sub(r"</?td>", "", item) for item in d] clean_addresses = [re.sub(r"</?td>", "", item) for item in a] # 写入CSV文件 with open('房产销售数据.csv', 'w', encoding='utf-8-sig', newline='') as f: writer = csv.writer(f) # 写入表头 writer.writerow(['销售日期', '地址']) # 配对日期和地址,逐行写入 for date, addr in zip(clean_dates, clean_addresses): writer.writerow([date, addr])
参数说明
encoding='utf-8-sig'是为了避免在Excel中打开CSV时出现中文乱码newline=''是为了避免写入CSV时出现多余空行zip()函数会按顺序把两个列表的元素一一配对,正好匹配你两个列表一一对应的关系
更稳定的优化方案
你其实不需要把HTML转成字符串用正则匹配,直接用BeautifulSoup解析表格行的单元格即可,逻辑更清晰,也不容易出现正则匹配出错的情况,示例逻辑如下:
# 替换原有正则匹配部分的代码 rows = [] for tr in list_.find_all('tr')[1:]: # 跳过表头行 tds = tr.find_all('td') # 按需取对应列的内容,索引值根据实际表格列顺序调整即可 sale_date = tds[0].get_text(strip=True) address = tds[2].get_text(strip=True) rows.append([sale_date, address]) # 直接批量写入即可 with open('房产销售数据.csv', 'w', encoding='utf-8-sig', newline='') as f: writer = csv.writer(f) writer.writerow(['销售日期', '地址']) writer.writerows(rows)
内容的提问来源于stack exchange,提问作者Steven Greer
相关产品推荐
相关产品推荐

