![](/img/trans.png)
[英]Python error “UnicodeEncodeError: 'charmap' codec can't encode character” in MongoDB
[英]Scraping ERROR in Python: 'charmap' codec can't encode character / can't concat str to bytes
當我嘗試從“ url”中刮取帶有Finish-Names的文本時,出現上述錯誤。 我在下面的代碼中注釋了我嘗試的解決方案和相應的錯誤。 我既不知道如何解決這些問題,也不知道確切的問題是什么。 我是Python的初學者。 任何幫助表示贊賞。
我的代碼:
from lxml import html
import requests
page = requests.get('url')
site = page.text # ERROR -> 'charmap' codec can't encode character '\x84' in
# position {x}: character maps to <undefined>
# site = site.encode('utf-8', errors='replace') # ERROR -> can't concat str to bytes
# site = site.encode('ascii', errors='replace') # ERROR -> can't concat str to bytes
with open('url.txt', 'a') as file:
try:
file.write(site + '\n')
except Exception as err:
file.write('an ERROR occured: ' + str(err) + '\n')
和原始異常:
Traceback (most recent call last):
File "...\parse.py", line 12, in <module>
file.write(site + '\n') File
"...\python36\lib\encodings\cp1252.py", line 19, in encode return
codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\x84' in position
12591: character maps to <undefined>
問候,多米尼克
試試這個
with open('url.txt', 'a',encoding='utf-8') as file:
我認為它的發生是由於Unicode轉換。
1.將以下行添加到.py文件的頂部:
# -*- coding: utf-8 -*-
或者2.使用str.encode('utf8')
函數
ex : `site = site.encode('utf8')`
如您所指示,如果在page.text
上發生異常:
當您請求requests
響應的text
,它將使用頁面聲稱的編碼。如果頁面錯誤,將失敗,通常會引發UnicodeDecodeError
。
對於這樣的調試問題,您絕對應該打印出從服務器收到的編碼requests
:
print(page.encoding)
瀏覽器通常只會顯示mojibake。 有時,他們甚至會意識到編碼錯誤,並嘗試猜測編碼。 他們很少失敗並且拒絕展示任何東西。 這對於設計為立即顯示數據的東西是有意義的。 對於許多旨在處理數據或稍后存儲數據的程序而言,這沒有任何意義(您希望盡快知道那里存在問題,而不是在存儲500GB的無用垃圾之后),等等。這就是為什么requests
不這樣做的原因。努力去做魔術。
如果您知道編碼是Latin-6 / IO-8859-10,即使它聲稱是其他編碼,也可以手動對其進行解碼:
site = page.content.decode('iso-8859-10')
如果您不知道,則可以使用chardet
或Unicode, Dammit
之類的庫來進行瀏覽器的猜測。
如果您想強制它僅解碼為某種內容 ,以后可以以相同的方式寫回,即使在此期間它看起來像垃圾,也可以使用surrogate-escape
錯誤處理程序:
site = page.content.decode('utf-8', 'surrogateescape')
# ...
with open('url.txt', 'a', encoding='utf-8', errors='surrogateescape') as file:
file.write(site + '\n')
但是,如果您實際上不對內容進行任何操作,則將其保存為字節可能會更容易:
site = page.content
# ...
with open('url.txt', 'ab') as file:
file.write(site + b'\n')
注意,用'ab'
代替'a'
,還有b'\\n'
而不是'\\n'
。 如果將字節保留為字節,或將字符串編碼為字節,則不能write
它們write
文本文件,只能寫入二進制文件,也不能將它們添加到字符串,而只能添加到其他字節。 這些似乎是您嘗試修復某些問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.