46

WeasyPrintのパブリックAPIでは、HTML入力用に(他のタイプの中でも)ファイル名を受け入れます。ビルトインで機能するファイル名ならどれでも機能するはずですが、後でに渡されるスキームopen()のURLに変換する必要があります。file://urllib.urlopen()

(すべてが内部的にURL形式になっています。相対URL参照を解決するには、ドキュメントの「ベースURL」が必要ですurlparse.urljoin()。)

urllib.pathname2urlは始まりです:

パス名のパスを、パスのローカル構文からURLのパスコンポーネントで使用される形式に変換します。これは完全なURLを生成しません。戻り値は、quote()関数を使用してすでに引用符で囲まれています。

強調は私のものですが、完全なURLが必要です。これまでのところ、これは機能しているようです。

def path2url(path):
    """Return file:// URL from a filename."""
    path = os.path.abspath(path)
    if isinstance(path, unicode):
        path = path.encode('utf8')
    return 'file:' + urlparse.pathname2url(path)

UTF-8はRFC3987(IRI)で推奨されているようです。しかし、この場合(URLは最終的にurllibを意味します)、おそらくsys.getfilesystemencoding()を使用する必要がありますか?

ただし、文献に基づいて、私は単に追加する必要はありません...私file:file://すべきでない場合を除いて:Windowsでは、結果はnturl2path.pathname2url()すでに3つのスラッシュで始まります。

したがって、問題は、これを実行してクロスプラットフォームにするためのより良い方法はありますか?

4

4 に答える 4

80

完全を期すために、Python 3.4以降では、次のことを行う必要があります。

import pathlib

pathlib.Path(absolute_path_string).as_uri()
于 2015-08-09T15:43:25.767 に答える
33

ドキュメントがそれを保証するのに十分厳密かどうかはわかりませんが、これは実際には機能すると思います。

import urlparse, urllib

def path2url(path):
    return urlparse.urljoin(
      'file:', urllib.pathname2url(path))
于 2013-01-12T21:38:56.140 に答える
5

上からコメントするクレジット@danodonovan

Python3の場合、次のコードが機能します。

from urllib.parse import urljoin
from urllib.request import pathname2url

def path2url(path):
    return urljoin('file:', pathname2url(path))
于 2015-06-08T06:14:30.967 に答える
0

次のことはあなたのために働きますか?

from urlparse import urlparse, urlunparse

urlunparse(urlparse('yourURL')._replace(scheme='file'))
于 2012-07-27T12:48:41.593 に答える