यूनिकोडेनाकोड: 'चार्मैप' कोडक वर्णों को एनकोड नहीं कर सकता है


205

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

मैं निम्नलिखित कोड का उपयोग कर रहा हूं:

import urllib.request
from bs4 import BeautifulSoup

get = urllib.request.urlopen("https://www.website.com/")
html = get.read()

soup = BeautifulSoup(html)

print(soup)

और मुझे निम्नलिखित त्रुटि मिल रही है:

File "C:\Python34\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 70924-70950: character maps to <undefined>

मुझे इसे ठीक करने के लिए क्या करना चाहिए?

जवाबों:


257

UnicodeEncodeErrorजब मैं वेब सामग्री को फ़ाइल में सहेज रहा था, तब मैं ऐसा ही कर रहा था । इसे ठीक करने के लिए मैंने इस कोड को बदल दिया:

with open(fname, "w") as f:
    f.write(html)

इसके साथ:

import io
with io.open(fname, "w", encoding="utf-8") as f:
    f.write(html)

उपयोग करने ioसे आपको पायथन 2 के साथ पिछड़ी अनुकूलता मिलती है।

यदि आपको केवल पायथन 3 का समर्थन करने की आवश्यकता है, तो आप openइसके बजाय बिलिन फ़ंक्शन का उपयोग कर सकते हैं :

with open(fname, "w", encoding="utf-8") as f:
    f.write(html)

6
मैक में (अजगर 3) एन्कोडिंग के बिना बस खुले के साथ पूरी तरह से काम करता है, लेकिन खिड़कियों में (w10, python3) एक विकल्प नहीं है। बस उस तरह से काम करता है, एन्कोडिंग = "utf-8" परम के साथ।
xtornasol512

3
धन्यवाद। यह मेरे लिए काम करता है, मैं xml फ़ाइलों के साथ काम कर रहा था और एक नई फ़ाइल में xml.toprettyxml () का परिणाम लिख रहा था
लुइस कैबरेरा बेनिटो

1
यह स्वीकृत उत्तर होना चाहिए क्योंकि यह अंततः आउटपुट के लिए एक स्ट्रिंग लिखेगा, और बाइट्स का एक स्ट्रिंग प्रतिनिधित्व नहीं होगा।
शिरकन

ओपी ने फाइल को पढ़ने का अनुरोध किया, लेकिन फाइल नहीं लिखी। समस्या कंसोल-संबंधित लगती है।
नेचुरलबोर्नकेम्पेर

187

मैंने इसे जोड़कर तय .encode("utf-8")कियाsoup

इसका मतलब है कि print(soup)बन जाता है print(soup.encode("utf-8"))


3
अपने स्क्रिप्ट के अंदर अपने वातावरण (जैसे, कंसोल) के एन्कोडिंग को हार्डकोड न करें, इसके बजाय सीधे यूनिकोड प्रिंट करें
15

यह सिर्फ एक bytesऑब्जेक्ट के रिप्रजेंट को प्रिंट कर रहा है, जो \xकई यूटीएफ -8 एनकोडेड टेक्स्ट के सीक्वेंस की गड़बड़ी के रूप में प्रिंट करेगा । मैं win_unicode_console@JFSebastian सुझाव के अनुसार उपयोग करने की सलाह देता हूं।
एरिक सन

2
मैंने उपरोक्त समाधान का उपयोग किया, लेकिन मुद्दों को सुलझाया: वर्ग MyStreamListener (tweepy.StreamListener): on_status (स्वयं, स्थिति) को हराया: प्रिंट (str (status.encode ("utf-8-8))) UnicodeEncodeError: 'चार्मैप' कोडेक t एनकोड वर्ण '\ u2019' स्थिति 87 में: चरित्र मानचित्र <अपरिभाषित>
विवेक

2
इसके b'\x02x\xc2\xa9'बजाय यह प्रिंट आउट (एक बाइट्स ऑब्जेक्ट) बनाता है
MilkyWay90

1
print(soup.encode("utf-8"))मेरे लिए काम किया है, लेकिन इससे पहले मुझे भी जोड़ना थाwith open("f_name", encoding="utf-8") as f: soup = BeautifulSoup(f, "html.parser")
TheWalkingData 22

44

पायथन 3.7 में, और विंडोज 10 चलाने से यह काम हो गया (मुझे यकीन नहीं है कि यह पायथन के अन्य प्लेटफार्मों और / या अन्य संस्करणों पर काम करेगा)

इस पंक्ति को प्रतिस्थापित करना:

with open('filename', 'w') as f:

इसके साथ:

with open('filename', 'w', encoding='utf-8') as f:

यह काम कर रहा है इसका कारण यह है कि फ़ाइल का उपयोग करते समय एन्कोडिंग को यूटीएफ -8 में बदल दिया जाता है, इसलिए यूटीएफ -8 के वर्णों को टेक्स्ट में परिवर्तित किया जा सकता है, इसके बजाय जब यह एक यूटीएफ -8 वर्ण का सामना करता है तो एक त्रुटि वापस आती है। वर्तमान एन्कोडिंग द्वारा दबा नहीं।


1
प्रिंट (सूप) वापसी \ xd0 \ xbf \ xd0 \ xb0 \ xb6 \ xd0 \ xb0 \ xd0 \ xb0 \ xd1 \ x83 \ xd0 \ xb9 \ xd
कॉफी इनविट

12

अनुरोध प्राप्त करने की प्रतिक्रिया को सहेजते समय, विंडो 10. पर पाइथन 3.7 पर एक ही त्रुटि डाली गई थी। URL से प्राप्त प्रतिक्रिया, एन्कोडिंग UTF-8 थी, इसलिए एन्कोडिंग की जांच करने के लिए हमेशा अनुशंसा की जाती है ताकि ऐसे तुच्छ मुद्दे से बचने के लिए इसे पारित किया जा सके। क्योंकि यह वास्तव में उत्पादन में बहुत समय मारता है

import requests
resp = requests.get('https://en.wikipedia.org/wiki/NIFTY_50')
print(resp.encoding)
with open ('NiftyList.txt', 'w') as f:
    f.write(resp.text)

जब मैंने एन्कोडिंग = "utf-8" को ओपन कमांड के साथ जोड़ा तो इसने सही प्रतिक्रिया के साथ फाइल को बचाया

with open ('NiftyList.txt', 'w', encoding="utf-8") as f:
    f.write(resp.text)

10

यहां तक ​​कि मुझे उसी समस्या का सामना करना पड़ा जो एन्कोडिंग के साथ होती है जब आप इसे प्रिंट करने, पढ़ने / लिखने या इसे खोलने का प्रयास करते हैं। जैसा कि अन्य लोगों ने कहा है कि .encoding = "utf-8" को जोड़ने में मदद मिलेगी यदि आप इसे प्रिंट करने का प्रयास कर रहे हैं।

soup.encode ( "utf-8")

यदि आप स्क्रैप किए गए डेटा को खोलने का प्रयास कर रहे हैं और हो सकता है कि इसे किसी फ़ाइल में लिखें, तो फ़ाइल को खोलें (......, एन्कोडिंग = "utf-8") के साथ

खुला के साथ (फ़ाइल नाम_एससीवी, 'डब्ल्यू', न्यूलाइन = '', एन्कोडिंग = "utf-v") को csv_file के रूप में:


6

जो लोग अभी भी इस त्रुटि को प्राप्त कर रहे हैं, उनके encode("utf-8")लिए soupभी इसे ठीक करना होगा।

soup = BeautifulSoup(html_doc, 'html.parser').encode("utf-8")
print(soup)

2
soupBeautifulSoupआपके द्वारा ऐसा करने के बाद अब कोई वस्तु नहीं है इसलिए इसे चालाकी से या खोजा नहीं जा सकता है
NaturalBornCamper
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.