2010-05-14 9 views
1

키릴 기호가있는 URL을로드해야합니다. 나는 그것이 일반 문자로 대체 할 브라우저에서 사용할 것이다 경우키릴 기호가있는 URL로드

http://wincode.org/%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/

하지만 URLLIB 코드는 404 오류와 함께 실패 : 내 스크립트는이 작업을해야한다. 이 URL을 올바르게 디코딩하는 방법은 무엇입니까?


주소에서 'url'과 같은 코드를 직접 사용하면 완벽하게 작동합니다. 하지만이 URL을 가져 오기 위해 구문 분석 페이지를 사용했습니다. 나는 내용이 키릴 문자 인 ur리스트를 가지고있다. 어쩌면 그들은 인코딩이 틀렸을까요? 다음은 더 많은 코드입니다.

requestData = urllib2.Request(%SOME_ADDRESS%, None, {"User-Agent": user_agent}) 
requestHandler = pageHandler.open(requestData) 

pageData = requestHandler.read().decode('utf-8') 
soupHandler = BeautifulSoup(pageData) 

topicLinks = [] 
for postBlock in soupHandler.findAll('a', href=re.compile('%SOME_REGEXP%')): 
    topicLinks.append(postBlock['href']) 

postAddress = choice(topicLinks) 

postRequestData = urllib2.Request(postAddress, None, {"User-Agent": user_agent}) 
postHandler = pageHandler.open(postRequestData) 
postData = postHandler.read() 

    File "/usr/lib/python2.6/urllib2.py", line 518, in http_error_default 
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) 
urllib2.HTTPError: HTTP Error 404: Not Found 
+0

URL은 변경없이 작동합니다. – bobince

+0

나를 위해 (urllib 및 urllib2의 urlopen에서). – Krab

+0

@bobince @Krab 업데이트를 참조하십시오. – Ockonal

답변

3

I have a list of urls which contents cyrillic.

OK, 그것은 예처럼하지 원시 (하지 %로 인코딩 된) 키릴 문자를 포함하고 실제로는 전혀 URL이 아닌 경우.

비 ASCII 문자가있는 주소는 IRI으로 알려져 있습니다. IRI는 HTML 링크에서 사용되면 안되지만 브라우저는 이러한 실수를 수정하는 경향이 있습니다. 퓨니 코드 (IDNA)를 사용하여 호스트 이름 부분에

  1. 인 코드 ASCII 문자가 아닌 문자 :

    당신이 다음 urllib로 열 수있는 URI에 IRI를 변환하려면, 당신은에 있습니다.

  2. 은 IRI에서 UTF-8 바이트의 나머지 부분에 비 ASCII 문자를 인코딩하고 URL 인코딩하여 (예제 URL 에서처럼 %D0%BF...이됩니다).

an example implementation.

+0

다른 구현을 추가했습니다 : http : //www.koders .com/python/fid50A5ABE4BE396F5BFA66E8F65188607FE4F722DD.aspx? s = iri # L2 그러나 이것은 나를 위해 작동하지 않습니다. Same 404. – Ockonal

+0

내 scipt가 직접 list 객체에있는 모든 url을 복사했습니다. 그것은 작동합니다. – Ockonal

1

urllib.unquote 메서드를 사용해보십시오.

>>> import urllib 
>>> string = urllib.unquote("http://wincode.org/%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/") 
>>> print string.decode("utf-8") 
http://wincode.org/программирование/ 
+0

디코딩 ('utf-8') 근처 : UnicodeEncodeError : 'ascii'코덱은 19-50 위치의 문자를 인코딩 할 수 없습니다. 서수가 범위 내에 없습니다 (128) – Ockonal

관련 문제