区分文件名和URL

时间:2012-07-27 12:37:51

标签: python url filenames

在WeasyPrint的公共API中,我接受HTML输入的文件名或URL(以及其他类型):

document = HTML(filename='/foo/bar/baz.html')
document = HTML(url='http://example.net/bar/baz.html')

还可以选择不命名参数,让WeasyPrint猜测它的类型:

document = HTML(sys.argv[1])

有些情况很简单:如果它在Unix上以/开头,那么它就是一个文件名,如果它以http://开头,它可能是一个URL。但我们需要一种能够为任何字符串提供答案的通用算法。

目前我尝试匹配此正则表达式:^([a-z][a-z0-1.+-]*):。根据{{​​3}}匹配的字符串以有效的URI方案开头。这在Unix上并不坏,但在Windows上完全失败:C:\foo\bar.html匹配并被视为URL。

我可以将正则表达式中的*更改为+,并且只匹配至少两个字符长的URI方案。显然没有RFC 3986 (URI)短于此。

或者有更好的标准吗?也许我应该将“猜测”的URL限制为少数几种方案。更多奇特的案例仍然可以使用HTML(url=foo)

url.startswith(['http:', 'https:', 'ftp:', 'data:'])

2 个答案:

答案 0 :(得分:2)

正确的做法是接受类似文件的对象,而不是路径。

然后我可以传递一个文件,一个检索到的URL,或者其他你没想过的东西。

答案 1 :(得分:0)

如果您愿意,可以根据urlparse检查方案。

from urlparse import urlparse

scheme = urlparse(url).scheme
if not scheme or scheme=='file':
    pass # treat it as a file