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

20

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

到目前为止,我已经成功点击了COMMAND + S以弹出“另存为窗口”。

但是,我不知道如何:

  1. 更改文件的目录,
  2. 更改文件的名称,以及
  3. 点击“另存为”按钮。

有人能帮忙吗?

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

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

此外,我使用这种方法的原因是当我将页面源代码写入html文件并将抓取到的信息存储到csv文件中时,我会遇到 Unicode编码错误

将页面写入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:在位置1无法使用“ascii”编解码字符u'\xf8':序数不在128的范围内


最终我没有使用“另存为”方法,而是使用codecs和unicodecsv来解决html文件和csv文件写入的问题。请参考RemcoW的评论和此帖子https://dev59.com/x2Ml5IYBdhLWcg3wAC6h以获取详细信息。 - Tommy N
4个回答

27
with open('page.html', 'w') as f:
    f.write(driver.page_source)

请注意,在大多数网络驱动程序中,driver.page_source 在处理超过200MB的页面时可能会崩溃。对于巨大的页面,使用ActionChains 更加可靠。 - Carlos Roldán
在Python 2中,如果页面源代码中包含Unicode,则可能需要使用以下代码:driver.page_source.encode('utf-8') - mgalgs

9
你试图通过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)。 - Tommy N
@TommyN,你是在什么时候遇到这个错误的?是在尝试将页面源代码写入文件时吗? - RemcoW
是的,当我尝试将page_source写入HTML文件时会发生这种情况。您是否知道是否有任何解决方案可以最小化与那些特殊字符相关的信息丢失量?(我故意不想使用ignore) - Tommy N
@RemcoW 你觉得我也可以使用编解码器来写入CSV文件吗? - Tommy N
1
@TommyN 请查看此问题:https://dev59.com/x2Ml5IYBdhLWcg3wAC6h - RemcoW
在Ubuntu中,AutoIt的等效工具是什么? - Martin Thoma

5

您无法与系统对话框(例如保存文件对话框)进行交互。 如果您想保存页面HTML,可以执行以下操作:

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

1
可以使用 driver.page_source 来获取 HTML,这样就不需要手动查找 HTML 元素并获取其 outerHTML 了。 - RemcoW

2

这是RemcoW提供的完整可行的示例:

首先您需要安装一个webdriver,例如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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接