2012-07-21 15 views
5

का उपयोग करके एन्कोडिंग को कैसे संभालना है, मैंने बहुत लंबे समय तक एन्कोडिंग के साथ संघर्ष किया है, और आज मैं मानसिक ब्लॉक को खुले खुले तोड़ना चाहता हूं।पाइथन अनुरोध लाइब्रेरी

अभी, मैं Requests उपयोग कर रहा हूँ वेबसाइटों का एक समूह स्क्रैप करने का, और से क्या मैं इसे, HTTP हेडर उपयोग कर रहा है एन्कोडिंग कि पृष्ठों का उपयोग कर रहे यह पता लगाने की chardet पर वापस गिरने जब साइट के हेडर बता सकते हैं याद कर रहे हैं। वहां से, यह डाउनलोड किए गए बाइटकोड को डीकोड करता है, और फिर मुझे r.text में एक यूनिकोड ऑब्जेक्ट को मदद से हाथ में रखता है।

सभी अच्छे।

print foo.encode('utf-8') 

समस्या मुझे क्या करना है जब वह यह है कि:

लेकिन जहाँ मैं उलझन में हूँ कि वहाँ से मैं पाठ पर कुछ काम करना और फिर, stdout के लिए बाहर इसे प्रिंट एन्कोडिंग प्रदान जब मैं प्रिंट है कि, मुद्रित चीज गड़बड़ है। निम्नलिखित में, मैं शब्द 'निर्णय' और 'मानक' के बीच एक emdash प्राप्त करने की उम्मीद:

Declaratory judgmentsStandard of review. 

इसके बजाय, मैं इसमें चार छोटे संख्या के साथ boxy बात मिलता है। यहां यह निश्चित रूप से दिखाने के लिए, नहीं लगता है, लेकिन मुझे लगता है संख्या 0097 है, जो से मेल खाती है, तो मुझे क्या करना है कि मैं क्या मिलता है:

repr(foo) 
u'Declaratory judgments\x97Standard of review.' 

तो उस तरह की समझ में आता है, लेकिन जहाँ मेरे emdash है?

प्रक्रिया करने पर निर्भर करता:

  1. अनुरोध एक पेज डाउनलोड करता है और समझदारी से एक यूनिकोड वस्तु
  2. मैं इसके साथ काम करने के लिए पाठ
  3. मैं utf-8 और प्रिंट करने के लिए इसे सांकेतिक शब्दों में बदलना डीकोड यह बाहर।

समस्या कहां है? यह मेरे लिए mythical unicode sandwich जैसा लगता है, लेकिन स्पष्ट रूप से मुझे कुछ याद आ रही है।

उत्तर

4

आप कुछ अजीब कर रहे हैं। \x97cp1252 एन्कोडिंग में एक emdash है। यूनिकोड स्ट्रिंग में, यह U+0097 END OF GUARDED AREA है। किसी भी तरह, आप यूनिकोड के रूप में cp1252 बाइट्स पढ़ रहे हैं। उस कोड को और अधिक दिखाएं जो आपको इस स्थिति में मिला, और हम गहरी खुदाई कर सकते हैं।

पीएस: यूनिकोड सैंडविच शायद ही पौराणिक है, यह एक आदर्श प्रयास है! :)

+0

यूप! आप इसे किसी न किसी। [पेज] (http://www.sconet.state.oh.us/ROD/docs/default.asp?Page=1&Sort=docdecided%20DESC&PageSize=25&Source=0&iaFilter=2012&ColumnMask=669) समस्या है। यह एक एन्कोडिंग घोषित नहीं करता है इसलिए chardet इसे 'आईएसओ -885 9 -1' के रूप में पहचानता है, और अनुरोध इसे इस तरह डीकोड करता है। फिर, जब मैं इसे utf-8 के रूप में एन्कोड करता हूं, निश्चित रूप से यह भी विफल रहता है। आप इसे अपने सिर के ऊपर से कैसे जानते थे? मैं भविष्य में इससे बचना चाहता हूं? – mlissner

+0

ओह, और एक और सवाल ... फ़ायरफ़ॉक्स और क्रोम इस पृष्ठ को आईएसओ -885 9 -1 के रूप में भी पहचानते हैं ... फिर भी वे पूरी तरह से emdashes प्रदर्शित करते हैं! उनकी चाल क्या है? – mlissner

+0

लंबा अनुभव मुझे बताता है कि emdash जैसे अक्षर \ x9X पर एन्कोड किए गए हैं शायद cp1252 है। इसे विकिपीडिया पर देखकर पुष्टि हुई कि सीपी 1252 बाइट को मानचित्र करता है जिसे आपने अपेक्षित चरित्र को दिखाया था। cp1252 वास्तव में iso8859-1 का सुपरसैट है, प्रिंट करने योग्य पात्रों के साथ जहां iso8859-1 कोई नहीं है। तो जब ब्राउज़र कहते हैं कि वे 885 9 -1 का उपयोग कर रहे हैं, तो वे वास्तव में cp1252 का उपयोग करते हैं क्योंकि क्यों नहीं, यह सिर्फ अधिक वर्णों को प्रिंट करने योग्य बनाता है। –

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