在 WeasyPrint 的公共(public) 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.+-]*):
。根据 RFC 3986 (URI),匹配的字符串以有效的 URI 方案开头.这在 Unix 上还不错,但在 Windows 上完全失败:C:\foo\bar.html
匹配并被视为 URL。
我可以将正则表达式中的 *
更改为 +
并且只匹配至少两个字符长的 URI 方案。显然没有 known URI scheme比那个短。
或者有更好的标准吗?也许我应该将“猜测的”URL 限制为少数方案。更多奇特的情况仍然可以使用 HTML(url=foo)
。
url.startswith(['http:', 'https:', 'ftp:', 'data:'])
最佳答案
如果你真的必须在文件名和 URL 之间猜对,我会说一个包含 2 个或更多单词字符的字符串,然后一个冒号是一个 URL,其他任何东西都是一个文件,就像你建议的那样。
另一种选择:尝试将其作为文件打开。如果失败,请尝试将其作为 URL 打开。
最好还是听听 Python 的禅宗,“抵制猜测的诱惑”。来电者不知道他说的是文件名还是 URL?让他们具体说明。
关于python - 区分文件名和 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11687916/