在 Python 中使用 Selenium 在 Firefox 上保存网页

Posted

技术标签:

【中文标题】在 Python 中使用 Selenium 在 Firefox 上保存网页【英文标题】:Using Selenium in Python to save a webpage on Firefox 【发布时间】:2016-10-16 14:15:30 【问题描述】:

我正在尝试在Python 中使用Selenium 将网页保存在MacOS Firefox 上。

到目前为止,我已经成功点击COMMAND + S 弹出SAVE AS window。然而,

我不知道怎么做:

    改变文件目录, 更改名称 文件和 单击另存为按钮。

有人可以帮忙吗?

下面是我用来点击COMMAND + S的代码:

ActionChains(browser).key_down(Keys.COMMAND).send_keys("s").key_up(Keys.COMMAND).perform()

另外,我使用这种方法的原因是我遇到 Unicode Encode Error 时:-

    将 page_source 写入 html 文件并 将报废信息存储到 csv 文件中。

写入 html 文件:

file_object = open(completeName, "w")
html = browser.page_source
file_object.write(html)
file_object.close() 

写入 csv 文件:

csv_file_write.writerow(to_write)

错误:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xf8' in 位置 1:序数不在范围内(128)

【问题讨论】:

我最终没有使用 SAVE AS 方法,为了解决 html 文件和 csv 文件的写入问题,我使用了编解码器和 unicodecsv。详情请参考 RemcoW 的评论和此帖***.com/questions/18766955/…。 【参考方案1】:

您无法与保存文件对话框等系统对话框进行交互。 如果要保存页面 html,可以执行以下操作:

page = driver.page_source
file_ = open('page.html', 'w')
file_.write(page)
file_.close()

【讨论】:

获取 HTML 也可以通过使用driver.page_source 来完成。这样就无需手动查找 html 元素并获取其 outerHTML。【参考方案2】:

您想要实现的目标是 Selenium 无法实现的。打开的对话框不是 Selenium 可以与之交互的。

您可以做的关闭事情是收集page_source,它会为您提供单个页面的整个 HTML 并将其保存到文件中。

import codecs

completeName = os.path.join(save_path, file_name)
file_object = codecs.open(completeName, "w", "utf-8")
html = browser.page_source
file_object.write(html)

如果您确实需要保存整个网站,您应该考虑使用 AutoIT 之类的工具。这将使与保存对话框交互成为可能。

【讨论】:

谢谢!我知道这种方法。但是,对于我的网页包含提示 Unicode 编码错误的字符,我需要将网页保存为原始格式以避免丢失重要信息。 Unicode 编码错误的一个示例是 ... 'ascii' 编解码器无法在位置 1 编码字符 u'\xf8':序数不在范围内(128)。 @TommyN 你什么时候收到这个错误?尝试将 page_source 写入文件时? 是的,当我尝试将 page_source 写入 html 文件时会发生这种情况。您是否知道我是否有任何解决方案可以最大程度地减少与这些特殊字符有关的信息丢失量? (我故意不想使用忽略) @RemcoW 你认为我也可以使用编解码器写入 csv 文件吗? @TommyN 看看这个问题:***.com/questions/18766955/…【参考方案3】:

这是 RemcoW 提供的答案的完整工作示例:

您首先必须安装一个网络驱动程序,例如pip install selenium chromedriver_installer.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# core modules
import codecs
import os

# 3rd party modules
from selenium import webdriver


def get_browser():
    """Get the browser (a "driver")."""
    # find the path with 'which chromedriver'
    path_to_chromedriver = ('/usr/local/bin/chromedriver')
    browser = webdriver.Chrome(executable_path=path_to_chromedriver)
    return browser


save_path = os.path.expanduser('~')
file_name = 'index.html'
browser = get_browser()

url = "https://martin-thoma.com/"
browser.get(url)

complete_name = os.path.join(save_path, file_name)
file_object = codecs.open(complete_name, "w", "utf-8")
html = browser.page_source
file_object.write(html)
browser.close()

【讨论】:

【参考方案4】:
with open('page.html', 'w') as f:
    f.write(driver.page_source)

【讨论】:

请注意,driver.page_source 在大多数 web 驱动程序中可能会在页面大于 200MB 时崩溃。对于大页面,using ActionChains 更可靠。 在 Python 2 上,您可能需要在页面源中使用 unicode:driver.page_source.encode('utf-8')

以上是关于在 Python 中使用 Selenium 在 Firefox 上保存网页的主要内容,如果未能解决你的问题,请参考以下文章

如何查看python selenium的api

Python + Selenium - 如何检查使用 CSS 设置样式并显示为内容的图像?

Python(81)_selenium定位页面元素

python+selenium环境安装

python网页爬虫开发之六-Selenium使用

selenium-确定找到的element唯一