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

新手上路,请多包涵

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

有关示例,请参见此链接:

http://docs.bokeh.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 并适当地更改了代码。

如何在 python 中使用 Selenium WebDriver 进行部分截图?

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"}

显然文件名不是 url,所以很清楚。如果您将它传递给一个网站,它就可以正常工作。任何帮助加载 html 和拍摄照片的帮助将不胜感激!它不必涉及硒。

原文由 Pete 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

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

导出 PNG 看起来像这样

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

导出 SVG 看起来像这样

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

有一些可选的依赖项需要安装。您可以 在用户指南的导出图部分 找到更多信息。

原文由 Optional Argument 发布,翻译遵循 CC BY-SA 4.0 许可协议

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()
    # The above line could be substituted for these 3 lines,
    # which would prevent the webpage from opening first
    ###########
    options = webdriver.ChromeOptions()
    options.add_argument('headless')
    driver = webdriver.Chrome(executable_path="C:\\ChromeDriver\\chromedriver.exe", chrome_options=options)
    # Your path to your chromedriver could be different than mine
    ###########

    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')

原文由 Pete 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题