ইউনিকোড এনকোড এরির: 'চারম্যাপ' কোডেক অক্ষরগুলি এনকোড করতে পারে না


204

আমি একটি ওয়েবসাইট স্ক্র্যাপ করার চেষ্টা করছি, তবে এটি আমাকে একটি ত্রুটি দেয়।

আমি নিম্নলিখিত কোড ব্যবহার করছি:

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>

আমি এই সমাধানের জন্য কি করতে পারি?

উত্তর:


256

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) এনকোডিং ছাড়াই খোলার সাথে পুরোপুরি কাজ করে তবে উইন্ডোতে (ডাব্লু 10, পাইথন 3) কোনও বিকল্প নয় an এনকোডিং = "utf-8" পরম সহ কেবল সেভাবেই কাজ করে।
xtornasol512

3
ধন্যবাদ. এটি আমার পক্ষে কাজ করেছিল, আমি এক্সএমএল ফাইলগুলির সাথে কাজ করছি এবং একটি নতুন ফাইলে xml.toprettyxml () এর ফলাফল লিখছিলাম
লুইস ক্যাবেরা বেনিটো

1
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত কারণ এটি শেষ পর্যন্ত আউটপুটটিতে একটি স্ট্রিং লিখবে, এবং বাইটের স্ট্রিং উপস্থাপনা নয়।
শিরকান

ওপি ফাইলটি পড়ার অনুরোধ জানিয়েছে, ফাইলটি লিখবে না। বিষয়টি কনসোল-সম্পর্কিত বলে মনে হচ্ছে।
ন্যাচারালবার্নক্যাম্পার

187

আমি যোগ .encode("utf-8")করে এটি স্থির করেছি soup

তার মানে print(soup)হয়ে ওঠে print(soup.encode("utf-8"))


3
আপনার স্ক্রিপ্টের মধ্যে আপনার পরিবেশের অক্ষর এনকোডিং (যেমন, কনসোল) হার্ডকোড করবেন না, পরিবর্তে ইউনিকোড সরাসরি প্রিন্ট করুন
jfs

এটি কেবলমাত্র কোনও bytesঅবজেক্টের পুনরায় মুদ্রণ করছে , যা \xঅনেকগুলি ইউটিএফ -8 এনকোডযুক্ত পাঠ্য থাকলে সিকোয়েন্সগুলির একটি জগাখিচুড়ি হিসাবে মুদ্রণ করবে । win_unicode_console@ জেএফএসবেস্টিয়ান এর পরামর্শ অনুসারে আমি ব্যবহারের পরামর্শ দিচ্ছি ।
এরিক সান

2
আমি উপরের সমাধানটি ব্যবহার করেছি তবে চটকদার সমস্যাগুলি পেয়েছি: ক্লাস মাইস্ট্রিমলিস্টনার (টুইপি.স্ট্রিমলাইজনার): ডিফ অন_স্ট্যাটাস (স্ব, স্থিতি): মুদ্রণ (স্ট্রাইট.এনকোড ("ইউটিএফ -8"))) ইউনিকোডইনকোডার: 'চারম্যাপ' কোডেক ' টি 87 in u2019 অক্ষরে এনকোড অক্ষর: চরিত্রের মানচিত্র <অপরিবর্তিত>
বিবেক

2
এটি এটিকে b'\x02x\xc2\xa9'পরিবর্তে (একটি বাইট অবজেক্ট) প্রিন্ট আউট করে তোলে
মিলকিওয়াই 90

1
print(soup.encode("utf-8"))আমার পক্ষে কাজ করেছেন, তবে এর আগে আমাকে যুক্ত করতে হয়েছিলwith open("f_name", encoding="utf-8") as f: soup = BeautifulSoup(f, "html.parser")
দ্য ওয়ালকিংডাটা

44

পাইথন ৩.7-এ এবং উইন্ডোজ 10 চালানো এটি কাজ করেছে (এটি অন্যান্য প্ল্যাটফর্ম এবং / অথবা পাইথনের অন্যান্য সংস্করণে কাজ করবে কিনা তা আমি নিশ্চিত নই)

এই লাইনটি প্রতিস্থাপন করা হচ্ছে:

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

এর সাথে:

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

এটি কাজ করার কারণটি হ'ল ফাইলটি ব্যবহার করার সময় এনকোডিংটি ইউটিএফ -8 এ পরিবর্তিত হয়েছে, সুতরাং ইউটিএফ -8-তে অক্ষরগুলি কোনও ইউটিএফ -8 অক্ষরের মুখোমুখি হওয়ার সাথে সাথে ত্রুটি ফিরে পাওয়ার পরিবর্তে পাঠ্যে রূপান্তরিত করতে সক্ষম হয় বর্তমান এনকোডিং দ্বারা সমর্থন নয়।


1
মুদ্রণ (স্যুপ) রিটার্ন করুন \ xd0 \ xbf \ xd0 \ xbe \ xd0 \ xb6 \ xd0 \ xb0 \ xd0 \ xbb \ xd1 \ x83 \ xd0 \ xb9 \ xd
কফি ইন টাইম

12

অনুরোধের প্রতিক্রিয়াটি সংরক্ষণ করার সময়, উইন্ডো 10 তে পাইথন ৩. on এ একই ত্রুটি নিক্ষেপ করা হয়েছিল, ইউআরএল থেকে প্রাপ্ত প্রতিক্রিয়াটি, এনকোডিংটি ইউটিএফ -8 ছিল তাই এটি সর্বদা এনকোডিং যাচাই করার জন্য সুপারিশ করা হয় যাতে এ জাতীয় তুচ্ছ সমস্যা এড়াতে এটি পাস করা যেতে পারে always কারণ এটি সত্যই উত্পাদন অনেক সময় নিহত

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" দিয়ে খুলুন)

csv_file হিসাবে খোলা (ফাইলের নাম_সিএসভি, 'ডাব্লু', নিউলাইন = '', এনকোডিং = "utf-8") সহ:


6

তাদের জন্য এখনও এই ত্রুটি পেয়ে যোগ encode("utf-8")করার soupএই ঠিক করবে।

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

2
soupআপনি এটি করার BeautifulSoupপরে আর কোনও জিনিস নয় তাই এটি
হেরফের
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.