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

Python循环爬取分页数据时HTML写入被覆盖的问题求助

解决HTML文件被覆盖的问题

你遇到的核心问题有两个:一是每次循环都会重新初始化lines列表,导致只保留最后一页的数据;二是文件写入操作放在了循环内部,每次用'w'模式打开文件都会直接覆盖之前的内容。

下面是修复后的代码,我标注了关键修改点:

from selenium.common.exceptions import NoSuchElementException
# 导入你需要的其他模块(比如webdriver、time等)

# 修改1:把lines初始化移到循环外面,用来累积所有页面的数据行
lines = []

while True:
    time.sleep(10)
    golds = driver.find_elements_by_css_selector(".widgetContainer #widgetContent > div.singleCell")
    print("found %d golds" % len(golds))
    
    template = """\
    <tr class="border">
        <td class="image"><img src="{0}"></td>
        <td class="title"><a href="{1}" target="_new">{2}</a></td>
        <td class="price">{3}</td>
    </tr>"""
    
    for gold in golds:
        goldInfo = {}
        goldInfo['title'] = gold.find_element_by_css_selector('#dealTitle > span').text
        goldInfo['link'] = gold.find_element_by_css_selector('#dealTitle').get_attribute('href')
        goldInfo['image'] = gold.find_element_by_css_selector('#dealImage img').get_attribute('src')
        try:
            goldInfo['price'] = gold.find_element_by_css_selector('.priceBlock > span').text
        except NoSuchElementException:
            goldInfo['price'] = 'No price display'
        
        line = template.format(goldInfo['image'], goldInfo['link'], goldInfo['title'], goldInfo['price'])
        lines.append(line)  # 追加新页面的数据行,而非重新创建列表
    
    try:
        # 点击下一页按钮
        driver.find_element_by_link_text("Next→").click()
    except NoSuchElementException:
        print("没有更多页面了,退出循环")
        break
    
    time.sleep(10)

# 修改2:把HTML生成和文件写入移到循环结束后,一次性写入所有数据
html = """\
<html>
<body>
    <table>
        <tr class='headers'>
            <td class='image'></td>
            <td class='title'>Product</td>
            <td class='price'>Price / Deal</td>
        </tr>
    </table>
    <table class='data'>
        {0}
    </table>
</body>
</html>\
"""

# 修改3:用with语句管理文件,自动关闭,避免手动关闭可能出现的遗漏
with open('./result.html', 'w', encoding='utf-8') as f:
    f.write(html.format('\n'.join(lines)))

driver.quit()  # 记得关闭浏览器实例

关键修改说明:

  • 累积数据行:将lines = []放在while True循环外部,确保每一页爬取到的数据都会追加到同一个列表中,不会丢失之前页面的内容。
  • 统一写入文件:把生成完整HTML和写入文件的操作移到循环结束后,这样所有页面的数据都收集完成后,才会生成一次完整的HTML文件,彻底避免覆盖问题。
  • 安全的文件操作:使用with open(...)语句,它会在代码块执行完毕后自动关闭文件,比手动调用f.close()更可靠。

另外给个小优化建议:可以用WebDriverWait替代固定的time.sleep来等待元素加载,让代码更高效,示例如下:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 等待元素加载完成,最多等10秒
golds = WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".widgetContainer #widgetContent > div.singleCell"))
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:01:31