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 中的所有行转换为统一编码,以便稍后解析。

谢谢你的帮助。

4

2 回答 2

0

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

或者,您可以以 UTF-8 格式打开并忽略或替换错误:

import csv
with open("filename", encoding="utf8", errors="replace") as f:
  for row in csv.reader(f):
    print(", ".join(row))
于 2013-11-12T05:50:14.823 回答
0

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

如果你想单独使用 BeautifulSoup 的字符集猜测,你可以。请参阅文档的Unicode,该死的部分。如果你有一份可能已经使用过的所有编码的完整列表,但只是不知道该列表中实际使用了哪个编码,则将该列表传递给 Dammit。

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

但这两者都只是做出有根据的猜测。该文档解释了它们可能失败的所有无数种方式。

此外,如果每一行的编码方式不同(这比平时更加​​混乱),你将不得不对每一行进行 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)
于 2013-11-12T05:56:10.540 回答