python - UnicodeEncodeError: 'ascii' कोडेक स्थिति 20 में वर्ण \ 'xa0' को एन्कोड नहीं कर सकता है: क्रमशः श्रेणी में नहीं(128)




beautifulsoup python-2.x (12)

मुझे अलग-अलग वेब पृष्ठों (विभिन्न साइटों पर) से प्राप्त पाठ से यूनिकोड वर्णों से निपटने में समस्याएं आ रही हैं। मैं सुंदर सूप का उपयोग कर रहा हूँ।

समस्या यह है कि त्रुटि हमेशा पुन: उत्पन्न नहीं होती है; यह कभी-कभी कुछ पृष्ठों के साथ काम करता है, और कभी-कभी, यह यूनिकोड एन्कोडररर फेंक कर UnicodeEncodeError । मैंने बस इतना कुछ करने की कोशिश की है जिसके बारे में मैं सोच सकता हूं, और फिर भी मुझे कुछ भी नहीं मिला है जो किसी प्रकार की यूनिकोड से संबंधित त्रुटि को फेंकने के बिना लगातार काम करता है।

कोड उत्पन्न करने वाले कोड के अनुभागों में से एक नीचे दिखाया गया है:

agent_telno = agent.find('div', 'agent_contact_number')
agent_telno = '' if agent_telno is None else agent_telno.contents[0]
p.agent_info = str(agent_contact + ' ' + agent_telno).strip()

उपरोक्त स्निपेट चलाए जाने पर SOME तारों पर उत्पादित एक स्टैक ट्रेस यहां दिया गया है:

Traceback (most recent call last):
  File "foobar.py", line 792, in <module>
    p.agent_info = str(agent_contact + ' ' + agent_telno).strip()
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128)

मुझे संदेह है कि ऐसा इसलिए है क्योंकि कुछ पेज (या अधिक विशेष रूप से, कुछ साइटों के पेज) को एन्कोड किया जा सकता है, जबकि अन्य अनएन्डेड हो सकते हैं। सभी साइटें यूके में आधारित हैं और ब्रिटेन की खपत के लिए डेटा प्रदान करती हैं - इसलिए आंतरिककरण से संबंधित कोई समस्या नहीं है या अंग्रेजी के अलावा किसी अन्य चीज़ में लिखे गए पाठ से निपटना नहीं है।

क्या किसी के पास इस बारे में कोई विचार है कि इसे कैसे हल किया जाए ताकि मैं इस समस्या को हल कर सकूं?


अच्छी तरह से मैंने सब कुछ करने की कोशिश की लेकिन यह मदद नहीं की, चारों ओर घूमने के बाद मैंने निम्नलिखित पाया और इससे मदद मिली। पायथन 2.7 उपयोग में है।

# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')

अपनी स्क्रिप्ट की शुरुआत में नीचे पंक्ति जोड़ें (या दूसरी पंक्ति के रूप में):

# -*- coding: utf-8 -*-

यह अजगर स्रोत कोड एन्कोडिंग की परिभाषा है। पीईपी 263 में अधिक जानकारी।


एक सूक्ष्म समस्या भी असफल होने के कारण प्रिंटिंग आपके पर्यावरण चर गलत सेट है, उदाहरण के लिए। यहां एलसी_ALL "सी" पर सेट है। डेबियन में वे इसे सेटिंग को हतोत्साहित करते हैं: लोकेल पर डेबियन विकी

$ echo $LANG
en_US.utf8
$ echo $LC_ALL 
C
$ python -c "print (u'voil\u00e0')"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)
$ export LC_ALL='en_US.utf8'
$ python -c "print (u'voil\u00e0')"
voilà
$ unset LC_ALL
$ python -c "print (u'voil\u00e0')"
voilà

नीचे समाधान मेरे लिए काम किया, बस जोड़ा

यू "स्ट्रिंग"

(स्ट्रिंग का प्रतिनिधित्व यूनिकोड के रूप में) मेरी स्ट्रिंग से पहले।

result_html = result.to_html(col_space=1, index=False, justify={'right'})

text = u"""
<html>
<body>
<p>
Hello all, <br>
<br>
Here's weekly enterprise enrollment summary report.  Let me know if you have any questions. <br>
<br>
7 Day Summary <br>
<br>
<br>
{0}
</p>
<p>Thanks,</p>
<p>Lookout Data Team</p>
</body></html>
""".format(result_html)

मुझे प्रतीकों को हटाने के लिए मेरे चारों ओर सुरुचिपूर्ण काम मिला और स्ट्रिंग को निम्नानुसार स्ट्रिंग रखना जारी रखा:

yourstring = yourstring.encode('ascii', 'ignore').decode('ascii')

यह ध्यान रखना महत्वपूर्ण है कि अनदेखा विकल्प का उपयोग खतरनाक है क्योंकि यह यहां उपयोग किए गए कोड से किसी भी यूनिकोड (और अंतर्राष्ट्रीयकरण) समर्थन को चुपचाप छोड़ देता है, जैसा कि यहां देखा गया है:

>>> 'City: Malmö'.encode('ascii', 'ignore').decode('ascii')
'City: Malm'

मुझे बस यह समस्या थी, और Google ने मुझे यहां ले जाया, इसलिए यहां सामान्य समाधानों को जोड़ने के लिए, यह मेरे लिए काम किया गया है:

# 'value' contains the problematic data
unic = u''
unic += value
value = unic

http://nedbatchelder.com/text/unipain.html पढ़ने के बाद मुझे यह विचार था।

मैं पूरी तरह से समझने का दावा नहीं करता कि यह क्यों काम करता है। तो अगर कोई इस जवाब को संपादित कर सकता है या व्याख्या करने के लिए टिप्पणी कर सकता है, तो मैं इसकी सराहना करूंगा।


मैं हमेशा पाइथन फ़ाइलों की पहली दो पंक्तियों में कोड डालता हूं:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

मैंने अभी निम्नलिखित का उपयोग किया है:

import unicodedata
message = unicodedata.normalize("NFKD", message)

जांचें कि इसके बारे में कौन सा दस्तावेज़ कहता है:

unicodedata.normalize (फॉर्म, unistr) यूनिकोड स्ट्रिंग unistr के लिए सामान्य फॉर्म फॉर्म लौटें। फॉर्म के लिए वैध मान 'एनएफसी', 'एनएफकेसी', 'एनएफडी', और 'एनएफकेडी' हैं।

यूनिकोड मानक कैनोनिकल समकक्ष और संगतता समतुल्य की परिभाषा के आधार पर यूनिकोड स्ट्रिंग के विभिन्न सामान्यीकरण रूपों को परिभाषित करता है। यूनिकोड में, कई पात्रों को विभिन्न तरीकों से व्यक्त किया जा सकता है। उदाहरण के लिए, चरित्र यू +00 सी 7 (सीडीआईएलएएल के साथ लैटिन कैपिटल लिटर सी) को अनुक्रम यू +0043 (लैटिन कैपिटल लिटर सी) यू +0327 (कॉम्बिनाइंग सेडिला) के रूप में भी व्यक्त किया जा सकता है।

प्रत्येक चरित्र के लिए, दो सामान्य रूप होते हैं: सामान्य रूप सी और सामान्य रूप डी। सामान्य रूप डी (एनएफडी) को कैननिकल अपघटन के रूप में भी जाना जाता है, और प्रत्येक चरित्र को इसके विघटित रूप में अनुवादित करता है। सामान्य रूप सी (एनएफसी) पहले एक कैनोलिक अपघटन लागू करता है, फिर पूर्व-जोड़े वर्णों को फिर से बना देता है।

इन दो रूपों के अतिरिक्त, संगतता समतुल्यता के आधार पर दो अतिरिक्त सामान्य रूप हैं। यूनिकोड में, कुछ वर्ण समर्थित हैं जो आमतौर पर अन्य पात्रों के साथ एकीकृत होंगे। उदाहरण के लिए, यू +2160 (रोमैन NUMERAL ONE) वास्तव में यू +0049 (लैटिन कैपिटल लिटर I) जैसा ही है। हालांकि, यह मौजूदा वर्ण सेट (जैसे gb2312) के साथ संगतता के लिए यूनिकोड में समर्थित है।

सामान्य रूप केडी (एनएफकेडी) संगतता अपघटन लागू करेगा, यानी सभी समकक्ष पात्रों को उनके समकक्षों के साथ प्रतिस्थापित करेगा। सामान्य रूप केसी (एनएफकेसी) पहले संगतता अपघटन लागू करता है, इसके बाद कैनोलिक संरचना होती है।

यहां तक ​​कि यदि दो यूनिकोड तार सामान्यीकृत होते हैं और मानव पाठक के समान दिखते हैं, यदि कोई वर्ण जोड़ता है और दूसरा नहीं करता है, तो वे बराबर तुलना नहीं कर सकते हैं।

यह मेरे लिए हल करता है। सरल और आसान।


यदि आपके पास packet_data = "This is data" जैसे कुछ packet_data = "This is data" तो इसे packet_data प्रारंभ करने के ठीक बाद, अगली पंक्ति पर करें:

unic = u''
packet_data = unic

यह एक क्लासिक पायथन यूनिकोड दर्द बिंदु है! निम्नलिखित को धयान मे रखते हुए:

a = u'bats\u00E0'
print a
 => batsà

अब तक सभी अच्छे हैं, लेकिन अगर हम str (ए) कहते हैं, तो देखते हैं कि क्या होता है:

str(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)

ओह डुबकी, वह किसी को भी अच्छा नहीं करेगा! त्रुटि को ठीक करने के लिए, बाइट को स्पष्ट रूप से .encode के साथ एन्कोड करें और पाइथन को बताएं कि किस कोडेक का उपयोग करना है:

a.encode('utf-8')
 => 'bats\xc3\xa0'
print a.encode('utf-8')
 => batsà

Voil \ u00E0!

मुद्दा यह है कि जब आप str () कहते हैं, तो पाइथन आपके द्वारा दिए गए बाइट्स को आज़माने और एन्कोड करने के लिए डिफ़ॉल्ट वर्ण एन्कोडिंग का उपयोग करता है, जो आपके मामले में कभी-कभी यूनिकोड वर्णों का प्रतिनिधित्व करता है। समस्या को ठीक करने के लिए, आपको अजगर ('whatever_unicode') का उपयोग कर इसे प्रदान करने वाली स्ट्रिंग से निपटने के लिए पाइथन को बताना होगा। अधिकांश समय, आपको utf-8 का उपयोग करके ठीक होना चाहिए।

इस विषय पर एक उत्कृष्ट प्रदर्शनी के लिए, यहां नेड बचेचेल्डर की पिकॉन टॉक देखें: http://nedbatchelder.com/text/unipain.html


यहां सरल सरल कार्य मिलते here

def safe_unicode(obj, *args):
    """ return the unicode representation of obj """
    try:
        return unicode(obj, *args)
    except UnicodeDecodeError:
        # obj is byte string
        ascii_text = str(obj).encode('string_escape')
        return unicode(ascii_text)

def safe_str(obj):
    """ return the byte string representation of obj """
    try:
        return str(obj)
    except UnicodeEncodeError:
        # obj is unicode
        return unicode(obj).encode('unicode_escape')

समस्या यह है कि आप एक यूनिकोड चरित्र मुद्रित करने का प्रयास कर रहे हैं, लेकिन आपका टर्मिनल इसका समर्थन नहीं करता है।

आप इसे ठीक करने के लिए language-pack-en पैकेज स्थापित करने का प्रयास कर सकते हैं:

sudo apt-get install language-pack-en

जो सभी समर्थित संकुल (पायथन सहित) के लिए अंग्रेजी अनुवाद डेटा अपडेट प्रदान करता है। यदि आवश्यक हो तो अलग-अलग भाषा पैकेज स्थापित करें (आप किस वर्ण को मुद्रित करने का प्रयास कर रहे हैं)।

कुछ लिनक्स वितरणों पर यह सुनिश्चित करने के लिए आवश्यक है कि डिफ़ॉल्ट अंग्रेजी लोकल ठीक से सेट-अप हो जाएं (इसलिए यूनिकोड वर्णों को खोल / टर्मिनल द्वारा नियंत्रित किया जा सकता है)। कभी-कभी इसे मैन्युअल रूप से कॉन्फ़िगर करने से इसे इंस्टॉल करना आसान होता है।

फिर कोड लिखते समय, सुनिश्चित करें कि आप अपने कोड में सही एन्कोडिंग का उपयोग करें।

उदाहरण के लिए:

open(foo, encoding='utf-8')

यदि आपको अभी भी कोई समस्या है, तो अपने सिस्टम कॉन्फ़िगरेशन को दोबारा जांचें, जैसे कि:

  • आपकी लोकेल फ़ाइल ( /etc/default/locale ), जिसमें उदाहरण होना चाहिए

    LANG="en_US.UTF-8"
    LC_ALL="en_US.UTF-8"
    
  • खोल में LANG / LC_CTYPE का मूल्य।

  • जांचें कि आपका खोल किस लोकेल द्वारा समर्थित है:

    locale -a | grep "UTF-8"
    

ताजा वीएम में समस्या और समाधान का प्रदर्शन।

  1. वीएम शुरू करें और प्रावधान करें (उदाहरण के लिए vagrant का उपयोग करना):

    vagrant init ubuntu/trusty64; vagrant up; vagrant ssh
    

    देखें: उबंटू बक्से उपलब्ध हैं

  2. यूनिकोड वर्णों को प्रिंट करना (जैसे व्यापार चिह्न चिह्न जैसे ):

    $ python -c 'print(u"\u2122");'
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
    UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 0: ordinal not in range(128)
    
  3. अब language-pack-en इंस्टॉल करना:

    $ sudo apt-get -y install language-pack-en
    The following extra packages will be installed:
      language-pack-en-base
    Generating locales...
      en_GB.UTF-8... /usr/sbin/locale-gen: done
    Generation complete.
    
  4. अब समस्या हल हो गई है:

    $ python -c 'print(u"\u2122");'
    ™
    






python-unicode