在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:'])
答案 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