2013-10-22 10 views
7

मैं कुछ वेब पृष्ठों को पार्स करने के लिए सुंदर सूप का उपयोग कर रहा हूं।सुंदर सूप और यूनिकोड समस्याएं

कभी कभी मैं निम्नलिखित की तरह एक "यूनिकोड नरक" त्रुटि प्राप्त: पर इस लेख के स्रोत को देखते हुए

TheAtlantic.com [http://www.theatlantic.com/education/archive/2013/10/why-are-hundreds-of-harvard-students-studying-ancient-chinese-philosophy/280356/]

हम इस ओग में देखें: विवरण मेटा संपत्ति :

<meta property="og:description" content="The professor who teaches&nbsp;Classical Chinese Ethical and Political Theory claims, &quot;This course will change your life.&quot;" /> 

जब BeautifulSoup यह पार्स करता है, मैं देख रहा हूँ इस:

>>> print repr(description) 
u'The professor who teaches\xa0Classical Chinese Ethical and Political Theory claims, "This course will change your life."' 
,210

अगर मैं, UTF-8 में यह एन्कोडिंग की कोशिश इस अतः टिप्पणी की तरह चलता है: https://stackoverflow.com/a/10996267/442650

>>> print repr(description.encode('utf8')) 
'The professor who teaches\xc2\xa0Classical Chinese Ethical and Political Theory claims, "This course will change your life."' 

बस जब मैंने सोचा कि मैं नियंत्रण में मेरे सभी यूनिकोड मुद्दों, मैं अभी भी काफी समझ में नहीं आता क्या हो रहा है था, तो मैं कुछ प्रश्न पूछने जा रहा हूं:

1- सुंदर सूप &nbsp; से \xa0 [लैटिन वर्णमाला अंतरिक्ष चरित्र] क्यों परिवर्तित करेगा? इस पृष्ठ पर वर्णमाला और शीर्षलेख यूटीएफ -8 हैं, मैंने सोचा कि सुंदर सूप एन्कोडिंग के लिए उस डेटा को खींचता है? इसे <space> के साथ क्यों नहीं बदला गया था?

2- क्या रूपांतरण के लिए सफेद जगहों को सामान्य करने का कोई आम तरीका है?

3- जब मैंने यूटीएफ 8 को एन्कोड किया, तो \xa0\xc2\xa0 का अनुक्रम कहाँ बन गया?

मैं जहां मुझे बनना चाहता हूं, मुझे प्राप्त करने में सहायता के लिए unicodedata.normalize('NFKD',string) के माध्यम से सबकुछ पाइप कर सकता हूं - लेकिन मुझे यह समझना अच्छा लगेगा कि क्या गलत है और भविष्य में इस तरह की समस्या से बचें।

उत्तर

21

आपको कोई समस्या नहीं आ रही है। सब कुछ इरादा के रूप में व्यवहार कर रहा है।

&nbsp;non-breaking space character इंगित करता है। यह किसी स्थान के साथ प्रतिस्थापित नहीं किया गया है क्योंकि यह किसी स्थान का प्रतिनिधित्व नहीं करता है; यह एक गैर-ब्रेकिंग स्पेस का प्रतिनिधित्व करता है। किसी स्थान के साथ इसे स्थानांतरित करने से जानकारी खो जाएगी: वह स्थान कहां होता है, एक टेक्स्ट प्रतिपादन इंजन को लाइन ब्रेक नहीं डालना चाहिए।

गैर-ब्रेकिंग स्पेस के लिए यूनिकोड कोड बिंदु U + 00A0 है, जो पाइथन में यूनिकोड स्ट्रिंग में \xa0 के रूप में लिखा गया है।

U + 00A0 की UTF-8 एन्कोडिंग, हेक्साडेसिमल में, दो बाइट क्रम सी 2 A0, या एक अजगर स्ट्रिंग प्रतिनिधित्व में, \xc2\xa0 लिखा है। यूटीएफ -8 में, 7-बिट ASCII सेट से परे कुछ भी इसका प्रतिनिधित्व करने के लिए दो या दो से अधिक बाइट की आवश्यकता है। इस मामले में, उच्चतम बिट सेट आठवां बिट है। इसका मतलब है कि इसे दो बाइट अनुक्रम (बाइनरी में) 110xxxxx 10xxxxxx द्वारा दर्शाया जा सकता है जहां एक्स कोड बिंदु के बाइनरी प्रतिनिधित्व के बिट्स हैं। ए 0 के मामले में, यह 10000000 है, या जब यूटीएफ -8, 11000010 10000000 या सी 2 ए 0 में एन्कोड किया गया है।

बहुत से लोग HTML में &nbsp; का उपयोग रिक्त स्थान है जो (HTML में हमेशा की तरह एचटीएमएल खाली स्थान के नियम टूट द्वारा नष्ट नहीं कर रहे हैं, लगातार रिक्त स्थान, टैब्स के सभी रन पाने के लिए, और नई-पंक्तियों जब तक CSS white-space rules में से एक के लिए एक एकल अंतरिक्ष के रूप में व्याख्या हो लागू होते हैं), लेकिन वास्तव में यह नहीं है कि वे क्या चाहते हैं; उन्हें नामों जैसी चीजों के लिए इस्तेमाल किया जाना चाहिए, जैसे "श्रीमान।मियागी ", जहां आप नहीं चाहते हैं कि" श्री "और" मियागी "के बीच एक लाइन ब्रेक हो। मुझे यकीन नहीं है कि इस विशेष मामले में इसका उपयोग क्यों किया गया था, यह यहां जगह से बाहर है, लेकिन यह और भी है आपके स्रोत के साथ एक समस्या का, कोड जो इसका अर्थ है।

अब, यदि आपको वास्तव में लेआउट की परवाह नहीं है तो आपको कोई फर्क नहीं पड़ता कि टेक्स्ट लेआउट एल्गोरिदम इसे स्थानांतरित करने के लिए एक स्थान के रूप में चुनते हैं या नहीं, लेकिन यह केवल एक नियमित स्थान के रूप में व्याख्या करना चाहते हैं, एनएफकेडी का उपयोग सामान्यीकरण एक पूरी तरह से उचित उत्तर है (या एनएफकेसी यदि आप विघटित उच्चारणों के लिए पूर्व-रचित उच्चारण पसंद करते हैं)। NFKC and NFKD normalizations मानचित्र वर्ण जैसे कि अधिकांश वर्ण जो अनिवार्य रूप से वही अर्थपूर्ण मूल्य का प्रतिनिधित्व करते हैं अधिकांश संदर्भों का विस्तार किया जाता है। उदाहरण के लिए, लिगरेचर का विस्तार किया जाता है (ffi -> ffi), पुरातन लंबे वर्णों को एस (एस -> एस) में परिवर्तित किया जाता है, रोमन अंक वर्णों का विस्तार किया जाता है I उनके व्यक्तिगत अक्षरों (Ⅳ -> चतुर्थ) तक, और गैर-ब्रेकिंग स्थान सामान्य स्थान में परिवर्तित हो जाती है। कुछ पात्रों के लिए, एनएफकेसी या एनएफकेडी सामान्यीकरण कुछ संदर्भों में महत्वपूर्ण जानकारी खो सकता है: ℌ और ℍ दोनों एच को सामान्यीकृत करेंगे, लेकिन गणितीय ग्रंथों में विभिन्न चीजों को संदर्भित करने के लिए उपयोग किया जा सकता है।

+1

वाह। बहुत बहुत धन्यवाद, ब्रायन। यह एक अद्भुत विस्तृत प्रतिक्रिया है। मुझे 2byte अनुक्रम नहीं समझा, और यह 99% अन्य चिंताओं को बताता है! बीटीडब्लू - मैं काफी हद तक निश्चित हूं कि इसका उपयोग इस उदाहरण में किया गया था "सीएमएस क्रूफ़्ट" (कुछ ऐसा जो मैंने कई बार सामना किया है)। –

+1

हाँ, एचटीएमएल का विश्लेषण करने की कोशिश करते समय "सीएमएस क्रूफ़्ट" हमेशा एक समस्या है। –