web-dev-qa-db-ja.com

PythonでSeleniumを使用してFirefoxでWebページを保存する

SeleniumPythonを使用してMacOS FirefoxにWebページを保存しようとしています。

これまでのところ、COMMAND + SをクリックしてSAVE AS windowをポップアップすることができました。しかしながら、

次の方法がわかりません。

  1. ファイルのディレクトリを変更し、
  2. ファイルの名前を変更し、
  3. [名前を付けて保存]ボタンをクリックします。

誰か助けてもらえますか?

以下は、COMMAND + Sをクリックするために使用するコードです。

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

さらに、この方法を使用する理由は、私がnicode Encode Errorに遭遇するためです。

  1. page_sourceをhtmlファイルに書き込み、
  2. スクラップされた情報を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'コーデックは位置1の文字u '\ xf8'をエンコードできません:序数が範囲外です(128)

11
Tommy N
with open('page.html', 'w') as f:
    f.write(driver.page_source)
14
misantroop

あなたが達成しようとしていることは、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)

Webサイト全体を保存する必要がある場合は、AutoITなどのツールの使用を検討してください。これにより、保存ダイアログを操作できるようになります。

8
RemcoW

ファイルの保存ダイアログなどのシステムダイアログを操作することはできません。ページのhtmlを保存したい場合は、次のようにします。

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

これは、RemcoWが提供する回答の完全で実用的な例です。

最初にWebドライバーをインストールする必要があります。 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()
2
Martin Thoma

これはpyautoguiライブラリで実現できますが、複数のページをループで保存する必要がある場合、画面上で他のタスクを実行することはできません。

import pyautogui
import time 
pyautogui.hotkey('ctrl', 's')
time.sleep(1)   
pyautogui.typewrite("file name")
time.sleep(1)
pyautogui.hotkey('enter')
0
EmreAkkoc