清除Python中的错误:“ charmap”编解码器无法编码字符/无法将str连接为字节

时间:2018-07-08 08:50:04

标签: python web-scraping python-requests

当我尝试从'url'刮取带有Finish-Names的文本时,我得到了ERRORs以上的错误。我在下面的代码中注释了我尝试的解决方案和相应的错误。我既不知道如何解决这些问题,也不知道确切的问题是什么。我是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>

致谢,多米尼克

3 个答案:

答案 0 :(得分:1)

试试看

with open('url.txt', 'a',encoding='utf-8') as file:

答案 1 :(得分:1)

我认为它的发生是因为Unicode转换。

1。在.py文件顶部添加以下行:

# -*- coding: utf-8 -*-

或 2.使用str.encode('utf8')函数

ex : `site = site.encode('utf8')`

答案 2 :(得分:0)

如您所指出的,如果page.text上发生了异常,则

当您向requests要求其text响应时,它将使用该页面声称的编码。如果该页面是错误的,将失败,通常会引发{{1 }}。

对于这样的调试问题,您绝对应该打印出从服务器获得的编码UnicodeDecodeError

requests

浏览器通常只会显示mojibake。有时,他们甚至会意识到编码错误,并尝试猜测编码。他们很少失败并且拒绝展示任何东西。这对于设计为立即显示数据的东西是有意义的。对于许多旨在处理数据或稍后存储数据的程序来说,这没有任何意义(您希望尽快知道有问题,而不是在存储500GB的无用垃圾之后),等等。这就是{{1 }}不会努力去做魔术。

如果您知道编码是Latin-6 / IO-8859-10,即使它声称是其他编码,也可以手动对其进行解码:

print(page.encoding)

如果您不知道,则可以使用chardetUnicode, Dammit之类的库来进行浏览器的猜测。

如果您想强迫它解码为某物,以便以后可以用相同的方式写回,即使在此期间看起来像垃圾,也可以使用requests错误处理程序:

site = page.content.decode('iso-8859-10')

但是,如果您实际上并没有对内容做任何事情,将其保留为字节可能会更容易:

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'添加到文本文件中,而只能添加到二进制文件中,并且不能将它们添加到字符串中,仅添加到其他字节中。这些似乎是您尝试修复某些问题。