どのURL解析関数のペアを使用する必要があり、その理由は何ですか?
urlparse
およびurlunparse
、またはurlsplit
とurlunsplit
?
どのURL解析関数のペアを使用する必要があり、その理由は何ですか?
urlparse
およびurlunparse
、またはurlsplit
とurlunsplit
?自分でリンクしたドキュメントから直接:
urllib.parse.urlsplit(urlstring, scheme='', allow_fragments=True)
これはに似てurlparse()
いますが、URLからパラメータを分割しません。urlparse()
これは通常、URLのパス部分の各セグメントにパラメーターを適用できる最新のURL構文(RFC 2396を参照)が必要な場合の代わりに使用する必要があります。
ドキュメントに記載されているように、
urlparse.urlparse
6タプル(追加のパラメータータプルを含む)
urlparse.urlsplit
は5タプルを返します
属性|インデックス| 値| 存在しない場合の値
params| 3 | 最後のパス要素のパラメーター| 空の文字列
リンクしたドキュメントに空でない例が含まれていなかったため、これparams
が見つかるまで私も混乱していました。
>>> urllib.parse.urlparse("http://example.com/pa/th;param1=foo;param2=bar?name=val#frag")
ParseResult(scheme='http', netloc='example.com', path='/pa/th', params='param1=foo;param2=bar', query='name=val', fragment='frag')
(私がオタクに狙われたので、いくつかの歴史。)
/user/213/settings
urlコンポーネントパラメータまたはクエリパラメータ以外のURL「パラメータ」について聞いたことがなく、/user?id=213
本質的に時代遅れだと思います。
当初、RFC 1738は、HTTP URLを;
、path
:で許可しないように定義していました。
http://<host>:<port>/<path>?<searchpart>
<path>
およびコンポーネント内で<searchpart>
、「/」、「;」、「?」予約されています。
;
ftp://のような他のスキームでは特別な意味で予約されていましたurl-path
:
<cwd1>/<cwd2>/.../<cwdN>/<name>;type=<typecode>
どうやら1995年に、RFC 1808はURLをとparams
の間のトップレベルのコンポーネントとして定義しました:path
query
<scheme>://<net_loc>/<path>;<params>?<query>#<fragment>
その後、1998年に、RFC 2396はURIを隣接するトップレベルのコンポーネントを持つものとして定義しpath
、query
:
<scheme>://<authority><path>?<query>
ここで、path
は複数として定義さpath_segments
れ、それぞれに次のものを含めることができますparam
。
path = [ abs_path | opaque_part ]
abs_path = "/" path_segments
path_segments = segment *( "/" segment )
segment = *pchar *( ";" param )
最後に、2005年に、RFC3986はRFC1808および2396を廃止し、RFC2396と同様に定義しました。 URI
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
hier-part = "//" authority path-abempty
/ path-absolute
/ path-rootless
/ path-empty
また、の特別な構文は;params
、HTTP(S)スキームまたは特定の実装に固有のURI構文の不透明な部分と見なされます。
階層パスのドットセグメントを除いて、パスセグメントは一般的な構文では不透明であると見なされます。URI生成アプリケーションは、多くの場合、セグメントで許可されている予約文字を使用して、スキーム固有または間接参照ハンドラ固有のサブコンポーネントを区切ります。たとえば、セミコロン( ";")および等号( "=")の予約文字は、そのセグメントに適用可能なパラメーターとパラメーター値を区切るためによく使用されます。カンマ( "、")の予約文字は、同様の目的でよく使用されます。たとえば、あるURIプロデューサーは「name; v = 1.1」などのセグメントを使用して「name」のバージョン1.1への参照を示し、別のURIプロデューサーは「name、1.1」などのセグメントを使用して同じことを示す場合があります。 パラメータの構文は、URIの間接参照アルゴリズムの実装に固有です。