Python webbrowser 打开带书签的 URL,如 www.something.com/file.html#top

2 投票
3 回答
1834 浏览
提问于 2025-04-16 19:42

我正在使用一个HTML文件作为我程序的帮助文档,想要在打开这个文件时直接跳到某个特定的位置。我原以为可以通过内置的webbrowser模块来实现,只需要在网址后面加上书签就行。

我的HTML文件名是:help.html。我以为可以用:help.html#top来实现。

这是我用来打开文件的代码,这段代码运行得很好:

webbrowser.open("Files\help.html")

这是我尝试用来在特定位置打开文件的代码,但在IE9中似乎无法显示(我不太明白为什么会在IE9中加载,因为我的默认浏览器是Chrome,而上面的代码在Chrome中可以正常运行):

webbrowser.open("Files\help.html#2.1.0")

大家有什么想法吗?

3 个回答

0

正如我在这里写的,这对我来说是有效的:

import sys
import subprocess

html_filepath = r'c:/path/to/files/html.html#2.1.0'

subprocess.check_call(
    [sys.executable, '-m', 'webbrowser', html_filepath]
)

你可以看到,其实你不需要在前面加上file://

1

我觉得 webbrowser 是在期待一个网址,你有没有试过这样的写法:

webbrowser.open("file://c:/path/to/files/html.html#2.1.0")
3

webbrowser.open() 是一个可以从命令行调用浏览器的命令。所以你可以先自己试着这样做。如果不行,可能是你的浏览器不支持打开本地文件或者其他原因。

比如在 Ubuntu 和 Firefox 上,webbrowser.open() 能够按照你的要求工作。(但正如 Dave Webb 在他的回答中提到的,你需要提供一个 file: 的网址,而不仅仅是文件名)。

至于为什么它不加载 Chrome 而是 IE9:(如果你想的话,可以自己查看 webbrowser.py 的代码)我认为它确实是尝试使用你默认的浏览器,通过 os.startfile(url) 来实现。当你双击你的 help.html 文件,或者在命令行中输入 help.html(根据需要调整路径)时,会发生什么?它应该会做同样的事情。

编辑:

似乎它并不总是使用命令行。在 Windows 上,当尝试使用默认浏览器时,它使用 os.startfile(),而这个又调用了 win32 的 ShellExecute API。ShellExecute 可以对文件、文件夹或网址执行某些操作,比如“打开”、“编辑”或“打印”,都是用默认应用程序来完成的。在这种情况下,ShellExecute 被请求去“打开”这个网址。

然而,似乎 ShellExecute 在打开 file: 的网址时会忽略片段标识符(即 # 后面的部分)。奇怪的是,这在 http: 的网址中并不是这样。可以推测,file: 的网址首先会被转换为普通的文件名。

对此似乎没有太多可以做的,除了:

  • 自己写一些“正确的操作”(并将其注册为 webbrowser 模块的浏览器控制器,然后使用 webbrowser.get() 来获取你的控制器,具体可以参考 文档
  • 像许多应用程序一样:配置你想使用的浏览器(或者让用户能够这样做)。最简单的方法是设置 BROWSER 环境变量(具体可以参考 webbrowser 模块文档
  • 通过本地的 http 服务器提供文件,并打开 http 地址,这样就像是 "http://localhost:8000/help.html#2.1.0"。(SimpleHttpServer 模块可能会派上用场)

或者,最简单的方法是:既然你似乎是在 Windows 上,就直接尝试专门打开 Internet Explorer:

  try:
      browser = webbrowser.get('c:\\Program Files\\Internet Explorer\\IEXPLORE.EXE')
  except Webbrowser.Error:
      browser = webbrowser.get()
  browser.open(url)

(这将回退到使用默认浏览器,所以你的代码在其他平台上仍然可以工作)

撰写回答