1

Pythonのurlparseで見られる奇妙な動作に対する既知の回避策があるかどうか疑問に思いました。

pythoninterpeterの数行の結果を次に示します。

>>> import urlparse
>>> urlparse.parse_qsl('https://localhost/?code=bork&charlie=brown')
[('https://localhost/?code', 'bork'), ('charlie', 'brown')]

上記の例では、最初の値「https:// localhost /?code」のキーはなぜですか?ただの「コード」ではないでしょうか?注:parse_qsにも同じ悪い動作があります。

>>> urlparse.urlparse('abcd://location/?code=bork&charlie=brown')
ParseResult(scheme='abcd', netloc='location', path='/?code=bork&charlie=brown', params='', query='', fragment='')
>>> urlparse.urlparse('https://location/?code=bork&charlie=brown')
ParseResult(scheme='https', netloc='location', path='/', params='', query='code=bork&charlie=brown', fragment='')

上記の例では、クエリ文字列が常にクエリ値に含まれるとは限らないことに注意してください。プロトコルがまったく重要なのはなぜですか?クエリフィールドは常にクエリ文字列を取得するべきではありませんか?'ftp'または他のよく知られたプロトコルでのテストも不幸なようです。

4

2 に答える 2

3

urlparse.parse_qsl(およびurlparse.parse_qs)は、リクエストのクエリ部分(?)の後の文字列を対象としたメソッドです。

最初にURL全体を理解するメソッド(urlparse.urlparse)を使用してから、結果からクエリを次の場所に渡したい場合がありますurlparse_qsl

>>> import urlparse
>>> myurl = urlparse.urlparse('https://localhost/?code=bork&charlie=brown')
>>> print myurl
ParseResult(scheme='https', netloc='localhost', path='/', params='', query='code=bork&charlie=brown', fragment='')
>>> print myurl.scheme
https
>>> print urlparse.parse_qs(myurl.query)
{'charlie': ['brown'], 'code': ['bork']}

クエリは一般的な構文で存在しますが、一部のプロトコルはそれらをサポートしていない可能性があるため、スキームは重要です。

参照:

http://en.wikipedia.org/wiki/URI_scheme(公式に登録されたスキームを確認してください)

于 2012-12-08T02:29:33.410 に答える
0

urlparse.parse_qs(および)のドキュメントにparse_qslは、「文字列引数として指定されたクエリ文字列を解析する」ことを意図していると記載されています。クエリ文字列ではなく、URL全体を指定します。代わりにこれを試してください:

>>> urlparse.parse_qsl('code=bork&charlie=brown')
[('code', 'bork'), ('charlie', 'brown')]
于 2012-12-08T02:29:46.063 に答える