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.