2009-12-16 12 views
9

अजगर 2.5.2 और लिनक्स डेबियन का उपयोग कर मैं एक स्पेनिश यूआरएल है कि एक स्पेनिश चार ('मैं') शामिल हैं से सामग्री प्राप्त करने के लिए कोशिश कर रहा हूँ:कर सकते हैं के साथ यूनिकोड URL को नहीं खोल अजगर

import urllib 
url = u'http://mydomain.es/índice.html' 
content = urllib.urlopen(url).read()

मैं हूँ 'यह त्रुटि मिलती: यूआरएल पार करने से पहले

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in position 8: ordinal not in range(128)

मैं का उपयोग कर की कोशिश की है इस urllib रहे हैं:

url = urllib.quote(url)

और इस:

url = url.encode('UTF-8')

लेकिन यह काम नहीं करता

आप मुझे बता सकते मैं गलत क्या कर रहा हूँ?

उत्तर

3

प्रति मानक लागू, RFC 1378, यूआरएल केवल ASCII वर्ण हो सकते हैं। अच्छा स्पष्टीकरण here, और मैं बोली:

"...Only alphanumerics [0-9a-zA-Z], the special characters "$-_.+!*'()," [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL."

यूआरएल मैं समझाता दिया है के रूप में, यह शायद मतलब है कि आप प्रतिस्थापित करना होगा कि "लोअरकेस मैं एक्यूट एक्सेंट" `% प्रवर्तन निदेशालय 'के साथ।

+4

मेरा मानना ​​है कि इस के बाद से बदल दिया गया है, और कम से: यहाँ मेरी कोड है कम से कम डोमेन अब मनमाना यूनिकोड वर्ण हो सकते हैं। – Cerin

+0

@Cerin सॉर्ट करें। [आईआरआई में मनमाने ढंग से यूनिकोड वर्ण हो सकते हैं] (https://www.w3.org/International/articles/idn-and-iri), लेकिन जब आप उन्हें नियमित यूआरआई में परिवर्तित करते हैं तो उन्हें 'Punycode' का उपयोग करके ASCII के लिए सामान्यीकृत किया जाता है (के लिए डोमेन घटक) और प्रतिशत-एन्कोडिंग (पथ घटक के लिए)। –

4

utf-8 के रूप में URL एन्कोडिंग, काम किया जाना चाहिए था। मुझे आश्चर्य है कि क्या आपकी स्रोत फ़ाइल ठीक से एन्कोड की गई है, और क्या दुभाषिया इसे जानता है। अपने अजगर स्रोत फ़ाइल को UTF-8 के रूप में सहेजा जाता है, तो उदाहरण के लिए, तो आप

# coding=UTF-8 
पहली या दूसरी पंक्ति के रूप में

होना चाहिए।

import urllib 
url = u'http://mydomain.es/índice.html' 
content = urllib.urlopen(url.encode('utf-8')).read() 

मेरे लिए काम करता है।

संपादित करें: यह भी ध्यान रखें कि एक इंटरैक्टिव अजगर सत्र (चाहे बेकार के माध्यम से, या एक कंसोल) में यूनिकोड टेक्स्ट एन्कोडिंग संबंधी कठिनाई से भरा है हो सकता है। उन मामलों में, आपको यूनिकोड अक्षर (जैसे आपके मामले में \ u00ED) का उपयोग करना चाहिए।

6

यह मेरे लिए काम करता है:

#!/usr/bin/env python 
# define source file encoding, see: http://www.python.org/dev/peps/pep-0263/ 
# -*- coding: utf-8 -*- 

import urllib 
url = u'http://example.com/índice.html' 
content = urllib.urlopen(url.encode("UTF-8")).read() 
3

यह मेरे लिए काम करता है। सुनिश्चित करें कि आप पाइथन के एक बिल्कुल हाल के संस्करण का उपयोग कर रहे हैं, और आपकी फ़ाइल एन्कोडिंग सही है।

# -*- coding: utf-8 -*- 
import urllib 
url = u'http://mydomain.es/índice.html' 
url = url.encode('utf-8') 
content = urllib.urlopen(url).read() 

(mydomain.es मौजूद नहीं है, तो DNS लुकअप विफल रहता है, लेकिन वहाँ है कि बात करने के लिए कोई यूनिकोड मुद्दे हैं।)

+2

पायथन 3 के साथ मुझे 'एट्रिब्यूट एरर:' बाइट्स ऑब्जेक्ट में इस कोड का उपयोग करते समय कोई विशेषता 'टाइमआउट' नहीं है। क्या कोई अजगर 3 समाधान है? – byxor

+1

@ ब्रैंडन इब्बॉटसन आपको यह प्रयास करना चाहिए: 'urlib.parse.quote (url) 'url के बजाय।एन्कोड ('utf-8') ' आप इसके बारे में यहां और अधिक पढ़ सकते हैं: https://docs.python.org/dev/library/urllib.parse.html#urllib.parse.quote – Snooze

+0

धन्यवाद @ स्नूज़! – byxor

संबंधित मुद्दे