最近在用python执行写入文件的程序时,出现了这个报错:
意思是将Unicode字符编码转为GBK时候出现了问题,可能是本身Unicode类型的字符中,包含了一些无法转换为GBK编码的一些字符;
所以我头脑中萌生出的第一种解决办法是把那些无法转换为GBK编码的字符给删了,转换不了的字符在报错中也说明了是’\xa0‘这个东西。于是我就修改了下代码。
from lxml import etree
import requests
url = "https://www.qb5.tw/book_51585/16647005.html"
resp = requests.get(url)
tree = etree.HTML(resp.text)
result = tree.xpath("/html/body/div[3]/div[2]/div[1]/text()")
a = ''.join(result)
b = a.replace('\xa0', "\n") #添加的代码
with open("a", mode="w") as f:
f.write(b)
resp.close()
然后呢,它又给我报了类似的错误:
额~,那就继续添加replace()咯。
b = a.replace('\xa0', "\n").replace('\ufffd', "")
OK,这次运行没有报错。
打开生成的文件看一下。
”额~~,这空行看起来真让人不舒服“,于是我吧“\n”去掉,结果跟加.....
看来这种替换法在美观上行不通,于是我就试试另外一种办法。那就是在gbk解码时忽略掉不能解码的数据。
from lxml import etree
import requests
url = "https://www.qb5.tw/book_51585/16647005.html"
resp = requests.get(url)
tree = etree.HTML(resp.text)
result = tree.xpath("/html/body/div[3]/div[2]/div[1]/text()")
a = ''.join(result)#把列表转化为字符串
b = a.replace(' ', "\n")
print(b)
with open("a", mode="w") as f:
f.write(b.encode("gbk","ignore").decode("gbk", "ignore"))#添加的代码
🆗成功执行,看看文件效果:
比刚刚的输出好看多了。
所以在遇到这种报错时,可以直接用这种方法解决问题。