UnicodeEncodeError: ตัวแปลงสัญญาณ 'charmap' ไม่สามารถเข้ารหัสอักขระได้


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ให้ความเข้ากันได้ย้อนหลังกับ Python 2

หากคุณต้องการสนับสนุน Python 3 คุณสามารถใช้openฟังก์ชันbuiltin แทน:

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

6
ใน mac (python 3) ทำงานได้อย่างสมบูรณ์แบบเพียงแค่เปิดโดยไม่ต้องเข้ารหัส แต่ใน windows (w10, python3) ไม่ใช่ตัวเลือก ทำงานในลักษณะนั้นด้วยการเข้ารหัส = "utf-8" พารามิเตอร์
xtornasol512

3
ขอบคุณ. มันใช้งานได้สำหรับฉันฉันทำงานกับไฟล์ xml และเขียนผลลัพธ์ของ xml.toprettyxml () ในไฟล์ใหม่
Luis Cabrera Benito

1
นี่ควรเป็นคำตอบที่ได้รับการยอมรับเพราะในที่สุดมันก็จะเขียนสตริงไปยังเอาต์พุตและไม่ใช่การแทนสตริงด้วยไบต์
Shirkan

OP ขอให้อ่านไฟล์ แต่อย่าเขียนไฟล์ ปัญหาน่าจะเกี่ยวข้องกับคอนโซล
NaturalBornCamper

187

ฉันคงได้โดยการเพิ่มการ.encode("utf-8")soup

นั่นหมายความว่าจะกลายเป็นprint(soup)print(soup.encode("utf-8"))


3
อย่า hardcode การเข้ารหัสอักขระของสภาพแวดล้อมของคุณ (เช่นคอนโซล) ภายในสคริปต์ของคุณพิมพ์ Unicode โดยตรงแทน
jfs

นี่เป็นเพียงการพิมพ์การพิมพ์ของbytesวัตถุซึ่งจะพิมพ์เป็นระเบียบของ\xลำดับหากมีข้อความที่เข้ารหัส UTF-8 จำนวนมาก ฉันแนะนำให้ใช้win_unicode_consoleเนื่องจาก @JFSebastian แนะนำ
Eryk Sun

2
ฉันใช้วิธีการแก้ปัญหาข้างต้น แต่งัวรับปัญหา: คลาส MyStreamListener (tweepy.StreamListener): def on_status (ตัวเองสถานะ): พิมพ์ (STR (status.encode ("utf-8"))) UnicodeEncodeError: 'charmap' codec สามารถ ' ไม่เข้ารหัสอักขระ '\ u2019' ในตำแหน่ง 87: อักขระแผนที่ไปยัง <undefined>
Vivek

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

44

ใน Python 3.7 และใช้งาน Windows 10 ได้ผล (ฉันไม่แน่ใจว่ามันจะทำงานบนแพลตฟอร์มอื่นและ / หรือ Python เวอร์ชั่นอื่น ๆ )

การแทนที่บรรทัดนี้:

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

ด้วยสิ่งนี้:

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

สาเหตุที่ใช้งานได้เนื่องจากการเข้ารหัสเปลี่ยนเป็น UTF-8 เมื่อใช้ไฟล์ดังนั้นอักขระใน UTF-8 จึงสามารถแปลงเป็นข้อความได้แทนที่จะส่งคืนข้อผิดพลาดเมื่อพบอักขระ UTF-8 ที่ ไม่สนับสนุนด้วยการเข้ารหัสปัจจุบัน


1
พิมพ์ (ซุป) ผลตอบแทน \ xd0 \ xbf \ xd0 \ xbe \ xd0 \ xb6 \ xd0 \ xb0 \ xd0 \ xd0 \ xbb \ xd1 \ x83 \ xd0 \ xb9 \ xd
กาแฟ inTime

12

ในขณะที่บันทึกการตอบสนองของคำขอรับข้อผิดพลาดเดียวกันถูกโยนลงใน Python 3.7 บนหน้าต่าง 10 การตอบสนองที่ได้รับจาก 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")

หากคุณกำลังพยายามเปิดข้อมูลที่ถูกคัดลอกและอาจเขียนลงในไฟล์ให้เปิดไฟล์ด้วย (...... , encoding = "utf-8")

ด้วย open (filename_csv, 'w', newline = '', encoding = "utf-8") เป็น csv_file:


6

สำหรับผู้ที่ยังได้รับข้อผิดพลาดนี้การเพิ่มencode("utf-8")ลงไปsoupจะแก้ไขปัญหานี้ด้วย

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

2
soupจะไม่เป็นBeautifulSoupวัตถุอีกต่อไปหลังจากคุณทำเช่นนี้ดังนั้นจึงไม่สามารถจัดการหรือค้นหาได้
NaturalBornCamper
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.