【发布时间】:2012-07-26 02:42:26
【问题描述】:
在 WeasyPrint 的公共 API 中,我接受 HTML 输入的文件名(以及其他类型)。任何与内置 open() 一起使用的文件名都应该可以使用,但我需要将其转换为 file:// 方案中的 URL,稍后将传递给 urllib.urlopen()。
(内部的一切都是 URL 形式。我需要有一个文档的“基本 URL”,以便使用 urlparse.urljoin() 解析相对 URL 引用。)
urllib.pathname2url 是一个开始:
将路径名路径从路径的本地语法转换为 URL 的路径组件中使用的形式。 这不会产生完整的 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() 的结果已经以三个斜杠开头。
所以问题是:有没有更好的方法来做到这一点并使其跨平台?
【问题讨论】:
-
您不能只检查
url[0:2] == '///'之类的内容,如果为假,则添加两个额外的斜线吗? -
约阿希姆,也许这行得通。我只是不知道要遵循什么规则来避免令人惊讶的极端情况。
-
嘿,您的示例代码使用了
urlparse.pathname2url,它不存在。你的意思是urllib.pathname2url?