我使用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。
答案 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窗口等。