首页 文章

BeautifulSoup无法解析意外编码

提问于
浏览
1

如果这篇文章写得不好,请提前为这篇文章道歉,因为我对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 回答

  • 0

    猜测随机数据的编码永远不会是完美的,但如果您对数据源有所了解,那么您可以做到这一点 .

    或者,您可以open作为UTF-8并忽略或替换错误:

    import csv
    with open("filename", encoding="utf8", errors="replace") as f:
      for row in csv.reader(f):
        print(", ".join(row))
    
  • 0

    您无法使用BeautifulSoup解析CSV文件,只能解析HTML或XML .

    如果你想使用BeautifulSoup自己的charset猜测,你可以 . 请参阅文档的Unicode, Dammit部分 . 如果您有可能已使用的所有编码的完整列表,但只是不知道该列表中的哪一个实际使用,请将该列表传递给Dammit .

    有一个不同的字符集猜测库,被称为chardet,你也可能想尝试 . (请注意,如果安装了Damde将使用chardet,因此您可能不需要单独尝试 . )

    但这两者都只是做出了有根据的猜测;文档解释了他们失败的所有方法 .

    此外,如果每一行的编码方式不同(这是一个比平常更大的混乱),您将不得不Dammit或chardet每一行,就好像它是一个单独的文件 . 由于使用的文本要少得多,猜测的准确性会低得多,但如果每条线路确实可能采用不同的编码,则无法做到这一点 .

    总而言之,它看起来像这样:

    encodings = 'utf-8', 'latin-1', 'cp1252', 'shift-jis'
    
    def dammitize(f):
        for line in f:
            yield UnicodeDammit(line, encodings).unicode_markup
    
    with open('foo.csv', 'rb') as f:
        for row in csv.reader(dammitize(f)):
            do_something_with(row)
    

相关问题