在WeasyPrint的公共API中,我接受HTML输入的文件名(以及其他类型)。任何与内置open()
一起使用的文件名都可以使用,但我需要将其转换为file://
方案中的网址,该网址稍后会传递给urllib.urlopen()
。
(内部的所有内容都是URL格式。我需要为文档提供“基本网址”,以便使用urlparse.urljoin()
解析相对网址引用。)
urllib.pathname2url是一个开始:
将路径名路径从路径的本地语法转换为URL路径组件中使用的表单。 这不会生成完整的网址。已使用quote()函数引用返回值。
重点是我的,但我确实需要一个完整的URL。到目前为止,这似乎有效:
def path2url(path):
"""Return file:// URL from a filename."""
path = os.path.abspath(path)
if isinstance(path, unicode):
path = path.encode('utf8')
return 'file:' + urlparse.pathname2url(path)
RFC 3987 (IRI)似乎推荐使用UTF-8。但在这种情况下(URL最终用于urllib)也许我应该使用sys.getfilesystemencoding()?
但是,根据the literature我不应该只添加file:
而是file://
...除非我不应该:在Windows上nturl2path.pathname2url()
的结果已经开始三条斜线。
所以问题是:有没有更好的方法来实现这一目标并使其跨平台?
答案 0 :(得分:45)
为了完整起见,在Python 3.4+中,你应该这样做:
import pathlib
pathlib.Path(absolute_path_string).as_uri()
答案 1 :(得分:33)
我不确定文档是否足以保证它,但我认为这在实践中有效:
import urlparse, urllib
def path2url(path):
return urlparse.urljoin(
'file:', urllib.pathname2url(path))
答案 2 :(得分:2)
感谢上述@danodonovan
发表评论。
对于Python3,以下代码将起作用:
from urllib.parse import urljoin
from urllib.request import pathname2url
def path2url(path):
return urljoin('file:', pathname2url(path))
答案 3 :(得分:0)
以下是否适用于您?
from urlparse import urlparse, urlunparse
urlunparse(urlparse('yourURL')._replace(scheme='file'))