2012-05-26 3 views
6

urllib 모듈을 사용하여 get 요청을 보낼 수 있도록 URL을 작성하려고합니다. 당신이 내 query_stringfinal_url 할 수 있습니다 관찰자 두 가지의 형식과 비교하면 지금urlencode python을 사용하여 쿼리 문자열을 작성하십시오.

>>> initial_url = "http://www.stackoverflow.com" 
>>> search = "Generate+value" 
>>> params = {"data":initial_url,"search":search} 
>>> query_string = urllib.urlencode(params) 
>>> query_string 
'search=Generate%2Bvalue&data=http%3A%2F%2Fwww.stackoverflow.com' 

:

나의 final_url

이제
url = "www.example.com/find.php?data=http%3A%2F%2Fwww.stackoverflow.com&search=Generate+value" 

나는 다음과 같은 방법을 시도 이것을 달성하는 것의이 가정하자

1) 매개 변수의 순서가 data=()&search=이 아닌 역순으로 지정되면 012입니다.

2) 또한 내가 첫 번째 변화는 사전의 무작위 행동 때문이라고 생각

Generate+value+ 인코딩. 그래서 OrderedDict to reverse the dictionary을 사용하고 있습니다. 나는 python 2.6.5을 사용하고로서 나는

pip install ordereddict 

을했다하지만

>>> od = OrderedDict((('a', 'first'), ('b', 'second'))) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'OrderedDict' is not defined 

을하려고 할 때 그래서, 내 질문에 OrderedDict을 사용하는 올바른 방법이 무엇인지 내 코드에서 사용할 수 없습니다입니다 python 2.6.5 그리고 urlencode은 을 무시합니다. Generate+value.

URL 빌드 올바른 방법입니다.

답변

15

+ 인코딩을 걱정하지 않아야합니다. URL을 이스케이프 처리 한 후 서버에 복원해야합니다. 명명 된 매개 변수의 순서는 중요하지 않습니다.

고려 OrderedDict, 그것은 아닌 파이썬의 내장 당신은 collections에서 가져해야합니다.

from urllib import urlencode, quote 
# from urllib.parse import urlencode # python3 
from collections import OrderedDict 

initial_url = "http://www.stackoverflow.com" 
search = "Generate+value" 
query_string = urlencode(OrderedDict(data=initial_url,search=search)) 

파이썬이 사용 너무 오래되어 모듈 collections에 OrderedDict이없는 경우 :

encoded = "&".join("%s=%s" % (key, quote(parameters[key], safe="+")) 
    for key in ordered(parameters.keys())) 

어쨌든 매개 변수의 순서는 중요하지 않습니다.

safe 매개 변수는 quote입니다. +은 이스케이프되지 않지만 서버는 Generate+valueGenerate value으로 해석합니다. %2B을 작성하고 %을 안전한 문자로 표시하여 +을 수동으로 탈출 할 수 있습니다.

+0

나는'Collection from Import OrderedDict'를 시도했지만 이제는'ImportError : OrderedDict' 이름을 가져올 수 없습니다. 나는 파이썬'2.6.5'을 사용하고있다. – RanRag

+0

파이톤 2.4에서 사용할 수 있어야한다. 'import collections '을 실행하면 무엇을 얻을 수 있습니까? –

+0

컬렉션을 성공적으로 가져올 수 있으며 오류가 발생하지 않습니다. OrderedDict는 Python 2.7 이후부터 소개되었지만. – RanRag

3

먼저 HTTP 요청의 매개 변수 순서는 완전히 관련이 없어야합니다. 그렇지 않다면 파싱 라이브러리가 잘못되어있다.

둘째, 물론 +이 인코딩됩니다. +은 인코딩 된 URL의 공백 자리 표시 자로 사용되므로 yor 생 성 문자열에 +이 포함되어 있으면 이스케이프 처리해야합니다.urlencode은 인코딩되지 않은 문자열을 예상하므로 이미 인코딩 된 문자열을 전달할 수 없습니다. 질문과 다른 답변에

+0

감사합니다. 나는 내 실수를하기 전에 확인하지 않았다. – RanRag

0

일부 코멘트 :

  1. 당신이 urllib.urlencode로 순서를 유지하려면, 대신 매핑 (DICT)의 K/V 쌍의 정렬 순서를 제출합니다. 당신이 dict을 전달할 때 urlencode은 반복 가능한 시퀀스를 얻기 위해 foo.items()을 호출하기 만하면된다.

# urllib.urlencode accepts a mapping or sequence # the output of this can vary, because `items()` is called on the dict urllib.urlencode({"data": initial_url,"search": search}) # the output of this will not vary urllib.urlencode((("data", initial_url), ("search", search)))

당신은 또한 처리하는 방법을 반복 가능한 값을 조정하는 secondard doseq 인수에 전달할 수 있습니다.

  1. 매개 변수의 순서는 부적절하지 않습니다. 예를 들어이 두 개의 URL을 :

    https://example.com?foo=bar&bar=foo https://example.com?bar=foo&foo=bar

    HTTP 서버는 관련이없는 이러한 매개 변수의 순서를 고려하지만, URL은 않을 것 비교하기 위해 설계된 기능을한다. 안전하게 URL을 비교하려면이 매개 변수를 정렬해야합니다.

    https://example.com?foo=3&foo=2&foo=1

URI는 사양 중복 키를 지원하지만, 우선 순위 또는 순서를 해결하지 않습니다

그러나 중복 키를 고려한다. 주어진 애플리케이션에서

, 이들은 각각 다른 결과를 트리거 할 수 있고,뿐만 아니라 유효 :

https://example.com?foo=1&foo=2&foo=3 
https://example.com?foo=1&foo=3&foo=2 
https://example.com?foo=2&foo=3&foo=1 
https://example.com?foo=2&foo=1&foo=3 
https://example.com?foo=3&foo=1&foo=2 
https://example.com?foo=3&foo=2&foo=1 
  1. + 중 부분 %20을 대를 urlencoded 형태의 공간 (나타내는 예약 문자 경로). urllib.urlencodeurllib.quote_plus()이 아닌 urllib.quote()을 사용하여 탈출합니다. 대부분 단지 이렇게 싶었던 OP : 생산

initial_url = "http://www.stackoverflow.com" search = "Generate value" urllib.urlencode((("data", initial_url), ("search", search)))

: 출력으로

data=http%3A%2F%2Fwww.stackoverflow.com&search=Generate+value

.

관련 문제