如果这篇文章写得不好,请提前为这篇文章道歉,因为我对Python非常陌生 . 我正在使用Python3和BeautifulSoup这是一个非常简单/愚蠢的问题 . 我试图在Python中解析CSV文件而不知道每行的编码将包含什么,因为每行包含来自多个源的原始数据 . 在我甚至可以解析文件之前,我正在使用BeautifulSoup来尝试清理它(我不确定这是不是一个好主意):
from bs4 import BeautifulSoup
def main():
try:
soup = BeautifulSoup(open('files/sdk_breakout_1027.csv'))
except Exception as e:
print(str(e))
但是,当我运行它时,我遇到以下错误:
'ascii'编解码器无法解码位置287中的字节0xed:序数不在范围内(128)
我的追溯指向CSV中的这一行作为问题的根源:
500i(í£:Android操作系统:4.0.4
有什么更好的方法来解决这个问题?我只想将此CSV中的所有行转换为统一编码,以便稍后解析 .
谢谢你的帮助 .
2 回答
猜测随机数据的编码永远不会是完美的,但如果您对数据源有所了解,那么您可以做到这一点 .
或者,您可以open作为UTF-8并忽略或替换错误:
您无法使用BeautifulSoup解析CSV文件,只能解析HTML或XML .
如果你想使用BeautifulSoup自己的charset猜测,你可以 . 请参阅文档的Unicode, Dammit部分 . 如果您有可能已使用的所有编码的完整列表,但只是不知道该列表中的哪一个实际使用,请将该列表传递给Dammit .
有一个不同的字符集猜测库,被称为chardet,你也可能想尝试 . (请注意,如果安装了Damde将使用chardet,因此您可能不需要单独尝试 . )
但这两者都只是做出了有根据的猜测;文档解释了他们失败的所有方法 .
此外,如果每一行的编码方式不同(这是一个比平常更大的混乱),您将不得不Dammit或chardet每一行,就好像它是一个单独的文件 . 由于使用的文本要少得多,猜测的准确性会低得多,但如果每条线路确实可能采用不同的编码,则无法做到这一点 .
总而言之,它看起来像这样: