2014-10-28 1 views
1

URL을 받았습니다 : https://www.packtpub.com/virtualization-and-cloud/citrix-xenapp ® -75-desktop-virtualization-solutions; 그것은 BeautifulSoup 출신입니다.urllib2.urlopen에 대한 url을 어떻게 처리합니까?

url=u'https://www.packtpub.com/virtualization-and-cloud/citrix-xenapp\xae-75-desktop-virtualization-solutions' 

다시 urllib2.urlopen으로 피드백하고 싶습니다.

import urllib2 
source = urllib2.urlopen(url).read() 

오류가 나는 얻을 :

UnicodeEncodeError: 'gbk' codec can't encode character u'\xae' in position 43: illegal multibyte sequence 

따라서, 나는 시도했다 : 그것은 페이지 소스를 가지고

source = urllib2.urlopen(url.encode("utf-8")).read() 

, 그러나 그것은 원래 URL에서 것과는 다르다.

originalUrl = 'https://www.packtpub.com/virtualization-and-cloud/citrix-xenapp®-75-desktop-virtualization-solutions' 
originalSource = urllib2.urlopen(originalUrl).read() 
originalSource == source 

결과는 거짓입니다. 이 URL을 고칠 생각이 있습니까? u '\ xae'을 원본 ®으로 변환하는 방법은 무엇입니까?

답변

3

비 ASCII 코드 포인트가 올바르게 인코딩 된 URL은 반드시 바이트 테스트로 유효해야합니다. 당신은 다음 인용 당신의 URL의 경로 url로 UTF-8로 인코딩해야합니다 :

import urllib 
import urllib2 
import urlparse 

originalUrl = u'https://www.packtpub.com/virtualization-and-cloud/citrix-xenapp\xae-75-desktop-virtualization-solutions' 
parsed_link = urlparse.urlsplit(originalUrl.encode('utf8')) 
parsed_link = parsed_link._replace(path=urllib.quote(parsed_link.path)) 
encoded_link = parsed_link.geturl() 
source = urllib2.urlopen(encoded_link).read() 

데모 :

>>> import urllib 
>>> import urllib2 
>>> import urlparse 
>>> originalUrl = u'https://www.packtpub.com/virtualization-and-cloud/citrix-xenapp\xae-75-desktop-virtualization-solutions' 
>>> parsed_link = urlparse.urlsplit(originalUrl.encode('utf8')) 
>>> parsed_link = parsed_link._replace(path=urllib.quote(parsed_link.path)) 
>>> encoded_link = parsed_link.geturl() 
>>> encoded_link 
'https://www.packtpub.com/virtualization-and-cloud/citrix-xenapp%C2%AE-75-desktop-virtualization-solutions' 
>>> source = urllib2.urlopen(encoded_link).read() 
>>> len(source) 
68758 
+0

전체 URL을하지 다루는 다른 쉬운 방법이 있나요 그냥 URL.path? – user4181172

+0

무슨 뜻인지 확실하지 않아요. 'urllib.quote'를 전체 URL에 적용하려고하면 콜론과 같이 잘못된 것들이 인코딩됩니다. –

+0

@Martijin, 감사합니다. 당신은 이미 내 질문에 대답했습니다. urllib.quote를 사용하여 URL.path를 인코딩하십시오. – user4181172

관련 문제