34

どのURL解析関数のペアを使用する必要があり、その理由は何ですか?

4

3 に答える 3

16

自分でリンクしたドキュメントから直接:

urllib.parse.urlsplit(urlstring, scheme='', allow_fragments=True)
これはに似てurlparse()いますが、URLからパラメータを分割しません。urlparse()これは通常、URLのパス部分の各セグメントにパラメーターを適用できる最新のURL構文(RFC 2396を参照)が必要な場合の代わりに使用する必要があります。

于 2011-03-29T12:08:51.953 に答える
7

ドキュメントに記載されているように、
urlparse.urlparse 6タプル(追加のパラメータータプルを含む)
urlparse.urlsplitは5タプルを返します

属性|インデックス| 値| 存在しない場合の値
params| 3 | 最後のパス要素のパラメーター| 空の文字列


参考:[RFC2396](https://www.rfc-editor.org/rfc/rfc2396.html#appendix-C)によると、URL仕様の_parameter_>現在のクライアントアプリケーションの広範なテストにより、展開されたシステムの大部分が「;」は使用しないでください 末尾のパラメーター情報を示し、パスセグメントにセミコロンが存在しても、そのセグメントの相対的な構文解析には影響しないことを示す文字。したがって、パラメータは個別のコンポーネントとして削除され、任意のパスセグメントに表示されるようになりました。それらの影響は、相対URI参照を解決するためのアルゴリズムから削除されました。
于 2015-05-01T02:57:42.440 に答える
7

リンクしたドキュメントに空でない例が含まれていなかったため、これ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/settingsurlコンポーネントパラメータまたはクエリパラメータ以外の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 1808URLをとparamsの間のトップレベルのコンポーネントとして定義しました:pathquery

<scheme>://<net_loc>/<path>;<params>?<query>#<fragment>

その後、1998年に、RFC 2396URIを隣接するトップレベルのコンポーネントを持つものとして定義しpathquery

<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の間接参照アルゴリズムの実装に固有です。

于 2020-08-06T18:36:03.750 に答える