2016-06-15 54 views
2

SeleniumPythonに入れて、MacOS Firefoxにウェブページを保存しようとしています。PythonでSeleniumを使用してFirefoxでWebページを保存する

これまでのところ、私はCOMMAND + SをクリックしてSAVE AS windowをポップアップさせました。 SAVE AS]ボタンをクリックし

  1. 変更ファイルのディレクトリ、
  2. 変更 ファイルの名前、および
  3. :しかし、

    私はどのように知りません。

誰かに助けてもらえますか?以下は

は私が COMMAND + Sをクリックし、使用を持っているコードです:

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

また、私はこの方法を使用する理由は、私が遭遇したということですのUnicodeエンコードエラーときI: -

  1. htmlファイルにpage_sourceを書き込み、
  2. は、廃棄された情報をcsvファイルに保存します。

htmlファイルへの書き込み:

csv_file_write.writerow(to_write) 

エラー:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xf8' in position 1: ordinal not in range(128)

+0

私はコーデックとunicodecsvを使用し、 'SAVE AS'メソッドを使用していない終わるとhtmlファイルやCSVファイルの書き込みの問題を解決します。詳細については、RemcoWのコメントとこの記事のhttp://stackoverflow.com/questions/18766955/how-to-write-utf-8-in-a-csv-fileを参照してください。 –

答えて

3

あなたは、ファイルの保存などのシステムダイアログと対話することはできません

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

書き込みcsvファイルへダイアログ。あなたはページのHTMLを保存したい場合は あなたはこのような何かを行うことができます。

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

HTMLを取得するには、 'driver.page_source'を使用することもできます。これにより、html要素を見つけて、そのouterHTMLを手作業で取得する必要がなくなります。 – RemcoW

5

何を達成しようとしていることはセレンで行うことは不可能です。開いたダイアログは、セレンが対話できるものではありません。

あなたができることは、page_sourceを収集して、1ページの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のようなツールを使用して調べる必要があります。これにより、保存ダイアログとの対話が可能になります。

+0

ありがとうございます!私はこの方法を知っています。ただし、私のWebページにUnicode Encode Errorsを促す文字が含まれているため、重要な情報が失われないように、元の形式でWebページを保存する必要があります。 Unicode Encode Errorsの例は... 'ascii'コーデックは、位置1の文字u '\ xf8'を範囲(128)の序数にエンコードできません。 –

+0

@ TommyNいつこのエラーが発生していますか?ファイルにpage_sourceを書き込もうとしていますか? – RemcoW

+0

はい、htmlファイルにpage_sourceを書き込もうとしたときに起こります。あなたがそれらの特殊文字に関して失われた情報の量を最小限に抑えるための解決策があるかどうか知っていますか? (私は意図的に無視したくない) –

0

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

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

これは、提供回答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() 
関連する問題