मुझे आश्चर्य है कि पाइथन के साथ एक वेबपृष्ठ का एक अक्षर प्राप्त करना बहुत जटिल है। क्या मुझे कोई रास्ता याद आ रहा है? HTTPMessage में बहुत सारे फ़ंक्शन हैं, लेकिन यह नहीं।वेबपृष्ठ के अक्षर प्राप्त करने के लिए एक अच्छा, विश्वसनीय लघु तरीका क्या है?
>>> google = urllib2.urlopen('http://www.google.com/')
>>> google.headers.gettype()
'text/html'
>>> google.headers.getencoding()
'7bit'
>>> google.headers.getcharset()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: HTTPMessage instance has no attribute 'getcharset'
तो आपको हेडर प्राप्त करना होगा, और इसे विभाजित करना होगा। दो बार।
>>> google = urllib2.urlopen('http://www.google.com/')
>>> charset = 'ISO-8859-1'
>>> contenttype = google.headers.getheader('Content-Type', '')
>>> if ';' in contenttype:
... charset = contenttype.split(';')[1].split('=')[1]
>>> charset
'ISO-8859-1'
यह एक बुनियादी कार्य के लिए आश्चर्यजनक मात्रा में कदम है। क्या मैं कुछ भूल रहा हूँ?
2616 (HTTP1.1) ' डेटा के चरित्र सेट (सेक्शन 3.4) को परिभाषित करने के लिए "मीडियासेट" पैरामीटर का उपयोग कुछ मीडिया प्रकारों के साथ किया जाता है। जब प्रेषक द्वारा कोई स्पष्ट वर्णमाला पैरामीटर प्रदान नहीं किया जाता है, तो "टेक्स्ट" प्रकार के मीडिया उपप्रकारों को HTTP के माध्यम से प्राप्त होने पर "आईएसओ -885 9 -1" के डिफ़ॉल्ट वर्णसेट मान के रूप में परिभाषित किया जाता है, जो आपके डिफ़ॉल्ट पर साइड-नोट के रूप में होता है ASCII होने के नाते। – plundra
@plundra: ठीक है, आईएसओ -885 9 -1 एएससीआईआई का एक सुपरसेट है, लेकिन आप सही हैं - यह एक अलग एन्कोडिंग है। – Piskvor
@Piskvor: और यदि कोई ऊपर से 'charset' का उपयोग करना था।उदाहरण के लिए, डीकोड() चीजें तोड़ जाएंगी (आईएसओ -885 9 -1 भेजने वाले पृष्ठों के साथ और अंतर्निहित पर निर्भर करता है) – plundra