簡體   English   中英

清除Python中的錯誤:“ charmap”編解碼器無法編碼字符/無法將str連接為字節

[英]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')

如果您不知道,則可以使用chardetUnicode, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM