2

在 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 上以 a 开头,它是一个文件名,如果它以它开头,http://它可能是一个 URL。但是我们需要一个通用算法来为任何字符串提供答案。

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

我可以在正则表达式中更改*+,并且只匹配至少两个字符长的 URI 方案。显然没有比这更短的已知 URI 方案。

还是有更好的标准?也许我应该将“猜测”的 URL 限制为少数方案。更多奇特的情况下仍然可以使用HTML(url=foo)

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

3 回答 3

3

如果你真的必须在文件名和 URL 之间猜好,我会说一个包含 2 个或更多单词字符的字符串,然后冒号是 URL,其他任何东西都是文件,正如你所建议的那样。

另一种选择:尝试将其作为文件打开。如果失败,请尝试将其作为 URL 打开。

Better might be to listen to the Zen of Python, "resist the temptation to guess". Doesn't the caller know if he's talking about a filename or a URL? Have them specify it.

于 2012-07-27T12:42:32.957 回答
2

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

然后,我可以将文件、检索到的 URL 或其他一些您没有想到的东西传递给您。

于 2012-07-27T12:40:46.683 回答
0

You could check the scheme if you wanted from urlparse if you want.

from urlparse import urlparse

scheme = urlparse(url).scheme
if not scheme or scheme=='file':
    pass # treat it as a file
于 2012-07-27T12:57:12.183 回答