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 で で始まる/場合はファイル名であり、で始まる場合はhttp://おそらく URL です。しかし、任意の文字列に対して答えを返す一般的なアルゴリズムが必要です。

現在、この正規表現に一致させようとしています: ^([a-z][a-z0-1.+-]*):. 一致する文字列は、 RFC 3986 (URI)に従って有効な URI スキームで始まります。これは Unix では悪くありませんが、Windows では完全に失敗します:C:\foo\bar.html一致し、URL のように扱われます。

*正規表現のtoを変更し+て、少なくとも 2 文字の長さの URI スキームにのみ一致させることができます。どうやらそれより短いURI スキームは知られていないようです。

それとももっと良い基準がありますか?おそらく、「推測された」URL を少数のスキームに制限する必要があります。よりエキゾチックなケースでは、まだ使用できますHTML(url=foo)

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

3 に答える 3

3

ファイル名と URL を本当によく推測する必要がある場合は、2 つ以上の単語文字を含む文字列とコロンが URL であり、それ以外はすべてファイルです。

別のオプション: ファイルとして開いてみてください。失敗した場合は、URL として開いてみてください。

Python の禅に耳を傾け、「推測する誘惑に抵抗する」ことをお勧めします。発信者は、ファイル名について話しているのか URL について話しているのかわかりませんか? 指定してもらいます。

于 2012-07-27T12:42:32.957 に答える
2

正しいことは、パスではなく、ファイルのようなオブジェクトを受け入れることです。

次に、ファイル、取得した URL、またはあなたが考えもしなかったその他のものを渡すことができます。

于 2012-07-27T12:40:46.683 に答える
0

必要に応じて、必要に応じてスキームを確認できurlparseます。

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 に答える