循环获取多日期页面HTML并合并写入文件时遇覆盖问题求助
解决多页面HTML合并写入文件的覆盖问题
我来帮你搞定这个问题!你当前代码的核心问题是:循环里每次都重新给schreib1、schreib2、schreib3赋值,最后这三个变量存的都是最后一个页面的HTML内容,所以写入文件时其实是把同一个页面重复写了三遍,之前的页面内容全被覆盖丢失了。
修改思路
我们需要把每个页面的HTML内容累加收集起来,而不是每次覆盖变量,最后一次性写入文件。具体步骤:
- 初始化一个空的字节串(因为
encode('utf-8')返回的是bytes类型)来存储所有页面内容 - 遍历URL列表时,把每个页面的HTML追加到这个字节串中
- 最后将所有收集到的内容写入文件
修改后的完整代码
from selenium import webdriver import time from bs4 import BeautifulSoup from datetime import date, datetime # 合并重复的导入,更简洁 from dateutil.rrule import rrule, DAILY # 生成含日期的URL kurl1 = 'https://www.matterhornparadise.ch/de/Buchen/Online-Tickets/Skipass-Zermatt?from=' kurl2 = '&to=' kurl3 = '#ticketCategory' # 设定日期范围:2019年12月1日至3日 a = date(2019, 12, 1) b = date(2019, 12, 3) # 生成URL列表 urllst = [] for dt in rrule(DAILY, dtstart=a, until=b): datum = dt.strftime("%Y-%m-%d") liste = kurl1 + datum + kurl2 + datum + kurl3 urllst.append(liste) # 初始化空字节串,用于累加所有页面的HTML内容 all_page_html = b"" # 遍历URL列表,收集每个页面的HTML for jede in urllst: driver.get(jede) # 等待页面加载(可根据实际情况调整时长) time.sleep(2) # 获取当前页面的HTML并追加到all_page_html中 current_html = driver.page_source.encode('utf-8') all_page_html += current_html # 将所有收集到的内容写入文件 today = date.today() now = today.strftime("%d.%m.%Y") with open(f'Daten_zermatt_{now}.htm', 'wb+') as file: file.write(all_page_html) # with语句会自动关闭文件,无需手动调用file.close()
关键改动说明
- 内容收集方式:用
all_page_html变量累加每个页面的内容,避免了之前的覆盖问题 - 文件管理:保留
with语句,它会自动处理文件的打开和关闭,比手动调用close()更安全可靠 - 页面加载等待:添加
time.sleep(2)确保页面完全加载后再获取源码,避免因为页面未加载完成导致获取的内容不完整 - 导入优化:合并了重复的
datetime模块导入,让代码更整洁
内容的提问来源于stack exchange,提问作者Fabian von Allmen
相关产品推荐
相关产品推荐

