当我尝试从'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>
致谢,多米尼克
答案 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)
如果您不知道,则可以使用chardet
或Unicode, 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'
添加到文本文件中,而只能添加到二进制文件中,并且不能将它们添加到字符串中,仅添加到其他字节中。这些似乎是您尝试修复某些问题。