Python webbrowser 打开带书签的 URL,如 www.something.com/file.html#top
我正在使用一个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 个回答
正如我在这里写的,这对我来说是有效的:
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://
。
我觉得 webbrowser
是在期待一个网址,你有没有试过这样的写法:
webbrowser.open("file://c:/path/to/files/html.html#2.1.0")
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)
(这将回退到使用默认浏览器,所以你的代码在其他平台上仍然可以工作)