Python打开html文件,截屏,裁剪并保存为图像

时间:2016-07-25 13:14:59

标签: python html selenium bokeh

我使用Bokeh包生成地图以显示模拟结果。输出是具有交互性的html格式的单独地图。各个地图需要交互性。

请参阅此链接以获取示例:

http://bokeh.pydata.org/en/0.10.0/docs/gallery/texas.html

模拟可以自动设置为运行多次,并为每次运行生成一个映射。这可能是100张地图。我希望能够将地图拼接在一起以创建电影 - 这不需要交互性。 Bokeh具有通过浏览器创建PNG文件的功能,因此可以手动将每个地图保存为文件,并使用ffmpeg创建电影。但是,如果您需要为100个文件执行此操作,则这不是一个真正的选项。目前没有办法通过Bokeh自动生成PNG文件,但我相信它会在某些时候添加。

所以我需要一个解决方法。我的想法是从他们存储在本地驱动器上的位置打开每个html文件,拍摄屏幕截图,裁剪图像以保留所需的部分并保存。但我还没有找到一个有效的解决方案。

轻松裁剪图像:

from PIL import Image

img = Image.open(file_name)
box = (1, 1, 1000, 1000)
area = img.crop(box)
area.save('saved_image', 'jpeg')

我的问题是打开html文件并首先拍摄屏幕截图以提供上述代码。

为此,我尝试了以下内容,但两者都需要URL而不是html文件。另外两个都使用Firefox并不适合我,但我已经安装了chrome并适当地修改了代码。

How to take partial screenshot with Selenium WebDriver in python?

http://www.idiotinside.com/2015/10/20/take-screenshot-selenium-python/

我的代码是:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('file_name')
driver.save_screenshot('image.png')
driver.quit()

返回:

{"code":-32603,"message":"Cannot navigate to invalid URL"}

显然,文件名不是网址,因此很清楚。如果你把它传递给一个网站,它的工作正常。获取html加载和拍照的任何帮助将不胜感激!它不必涉及Selenium。

4 个答案:

答案 0 :(得分:6)

从Bokeh 0.12.6开始,现在可以更轻松地直接从Python中截取这些屏幕截图,而无需打开浏览器。

导出PNG看起来像这样

export_png(plot, filename="plot.png")

导出SVG看起来像这样

plot.output_backend = "svg"
export_svgs(plot, filename="plot.svg")

需要安装一些可选的依赖项。 您可以在JTextPane#replaceSelection(String)

中找到更多信息

答案 1 :(得分:4)

hgazibara评论被证明是最简单的解决方案。下面提供了一些简化代码来提供答案。如果网页实际上不必显示自己的屏幕截图,那将是很好的。我会看看以后是否可以添加。

import glob
from PIL import Image
from selenium import webdriver 

# get a list of all the files to open
glob_folder = os.path.join(file_location, '*.html')

html_file_list = glob.glob(glob_folder)
index = 1

for html_file in html_file_list:

    # get the name into the right format
    temp_name = "file://" + html_file

    # open in webpage
    driver = webdriver.Chrome()
    driver.get(temp_name)
    save_name = '00' + str(index) + '.png'       
    driver.save_screenshot(save_path, save_name))
    driver.quit()
    index += 1

    # crop as required
    img = Image.open(save_path, save_name))
    box = (1, 1, 1000, 1000)
    area = img.crop(box)
    area.save('cropped_image' + str(index), 'png')

答案 2 :(得分:2)

您可以使用SimpleHTTPServer创建基本网络服务器并公开您的本地文件。

您应该在htmt为python -m SimpleHTTPServer 8000

的路径中运行此命令

然后将driver.get('file_name')更改为driver.get('localhost:8000/file_name.html')

我建议你在拍摄截图之前使用“等到”以确保所有内容都已加载:

driver.wait.until(EC.visibility_of_element_located((By.XPATH,'//*[@id="someID"]')))

答案 3 :(得分:0)

如果您正在运行Linux,则可能需要执行以下步骤。

首先在默认应用中通过command line打开html文件。你可能不得不做类似

的事情
import os

os.system('command to open html file')

使用solution listed截取屏幕截图。

然后按照建议在PIL中进行处理。

如果您在Windows中执行此操作,

您可能需要设置AutoIT驱动程序,以便可以使用python脚本来操作GUI窗口等。