UnicodeEncodeError: 'charmap' codec bileşeni karakterleri kodlayamıyor


208

Bir web sitesini kazımaya çalışıyorum, ama bu bana bir hata veriyor.

Aşağıdaki kodu kullanıyorum:

import urllib.request
from bs4 import BeautifulSoup

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

soup = BeautifulSoup(html)

print(soup)

Ve şu hatayı alıyorum:

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>

Bunu düzeltmek için ne yapabilirim?

Yanıtlar:


261

UnicodeEncodeErrorKopyalanmış web içeriğini bir dosyaya kaydederken de aynısını alıyordum . Düzeltmek için bu kodu değiştirdim:

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

Bununla:

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

Kullanmak iosize Python 2 ile geriye dönük uyumluluk sağlar.

Yalnızca Python 3'ü desteklemeniz gerekiyorsa openbunun yerine yerleşik işlevi kullanabilirsiniz :

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

6
Mac'te (python 3) kodlamadan sadece açık olarak mükemmel çalışır, ancak pencerelerde (w10, python3) bir seçenek değildir. Sadece bu şekilde çalışır, encoding = "utf-8" param.
xtornasol512

3
Teşekkür ederim. Benim için çalıştı, xml dosyalarıyla çalışıyordum ve xml.toprettyxml () sonucunu yeni bir dosyaya yazıyordum
Luis Cabrera Benito

1
Bu, kabul edilen yanıt olmalıdır, çünkü sonunda bayt dizesinin temsilini değil, çıktıya bir dize yazacaktır.
Shirkan

OP dosyayı okumak için değil, dosyayı okumak istedi. Sorun konsolla ilgili gibi görünüyor.
NaturalBornCamper

Bu çalışıyor. Ama io kullanmak zorunda kalmadınız, tek yapmanız gereken encoding="utf-8"açık fonksiyona dahil etmek
Mafia

189

Ben ekleyerek sabit .encode("utf-8")için soup.

Bu demek print(soup)oluyor print(soup.encode("utf-8")).


3
betiğinizdeki ortamınızın karakter kodlamasını (örneğin, konsol) kodlamayın, bunun yerine doğrudan Unicode yazdırın
jfs

Bu, yalnızca bir çok UTF-8 kodlu metin varsa bir dizi byteskarmaşası olarak yazdırılacak bir nesnenin repr'ını yazdırır \x. win_unicode_console@JFSebastian'ın önerdiği gibi kullanmanızı öneririm.
Eryk Sun

2
Yukarıdaki çözümü kullandım ama eşik sorunları alıyorum: sınıf MyStreamListener (tweepy.StreamListener): def on_status (self, status): print (str (status.encode ("utf-8"))) UnicodeEncodeError: 'charmap' codec can ' t 87 konumunda "\ u2019" karakterini kodlar: karakter <defined> ile eşleşir
Vivek

2
Bu, bunun b'\x02x\xc2\xa9'yerine yazdırılmasını sağlar (bayt nesnesi)
MilkyWay90

1
print(soup.encode("utf-8"))benim için çalıştı, ama bundan önce de eklemek zorunda kaldımwith open("f_name", encoding="utf-8") as f: soup = BeautifulSoup(f, "html.parser")
TheWalkingData

45

Python 3.7 ve Windows 10 çalıştıran bu çalıştı (diğer platformlarda ve / veya Python'un diğer sürümlerinde çalışıp çalışmayacağından emin değilim)

Bu satırın değiştirilmesi:

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

Bununla:

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

Çalışmasının nedeni, dosyayı kullanırken kodlamanın UTF-8 olarak değiştirilmesidir, bu nedenle UTF-8'deki karakterler, bir UTF-8 karakteriyle karşılaştığında bir hata döndürmek yerine metne dönüştürülebilir geçerli kodlama ile desteklenmez.


1
print (soup) return \ xd0 \ xbf \ xd0 \ xbe \ xd0 \ xb6 \ xd0 \ xb0 \ xd0 \ xbb \ xd1 \ x83 \ xd0 \ xb9 \ xd
Kahve inTime

13

Alma isteğinin yanıtı kaydedilirken, pencere 10'da Python 3.7'de aynı hata atıldı. URL'den alınan yanıt, kodlama UTF-8 idi, bu nedenle bu tür önemsiz sorunları önlemek için her zaman kodlamanın kontrol edilmesi önerilir. üretimde gerçekten çok zaman öldürdüğü için

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)

Open komutuyla encoding = "utf-8" eklediğimde dosyayı doğru yanıtla kaydetti

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

10

Yazdırmaya, okumaya / yazmaya veya açmaya çalıştığınızda oluşan kodlamada da aynı sorunla karşılaştım. Yukarıda belirtildiği gibi .encoding = "utf-8" eklenmesi, yazdırmaya çalışıyorsanız yardımcı olacaktır.

soup.encode ( "UTF-8")

Alıntılanan verileri açmaya ve belki de bir dosyaya yazmaya çalışıyorsanız, dosyayı (......, encoding = "utf-8") ile açın.

csv_file olarak open (dosyaadı_csv, 'w', newline = '', kodlama = "utf-8") ile:


6

Olanlar için hala ekleyerek, bu hatayı alıyorum encode("utf-8")için soupde bu çözecektir.

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

2
soupBeautifulSoupbunu yaptıktan sonra artık bir nesne değil, bu yüzden manipüle edilemez veya aranamaz
NaturalBornCamper
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.