BeautifulSoup ascii错误和csv

时间:2015-03-05 23:25:21

标签: python csv beautifulsoup ascii

我已阅读有关错误的所有帖子,但仍无法弄清楚如何调试我的具体问题。

从命令行,我正在读取csv文件。

adamg:NLP adamg$ python3 train_classifier.py samples.csv /Users/adamg/PycharmProjects/NLP/samples

如果我将其作为字节文件打开,就像这样:

training_pages_list_file = sys.argv[1]
with open(training_pages_list_file,'rb') as f:
    reader = csv.reader(f)
    training_page_list.extend(reader)

我收到错误:

  File "train_classifier.py", line 17, in <module>
    training_page_list.extend(reader)
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

但是,如果我将其更改为读取文本文件,或者不进行编码,则在将字符串传递给BeautifulSoup对象时会出错:

training_pages_list_file = sys.argv[1]
html_page_dir = sys.argv[2]
with open(training_pages_list_file,'r') as f:
    reader = csv.reader(f)
    training_page_list.extend(reader)

for page,category in training_page_list:
    cp = CraigsPage(os.path.join(html_page_dir,page))

CraigsPage.py

class CraigsPage():
    def __init__(self, page_file):
        self.doc_name = page_file
        self.soup = BeautifulSoup(open(page_file).read())
        self.title = self.soup.title.string

我收到错误:

  File "train_classifier.py", line 22, in <module>
    cp = CraigsPage(os.path.join(html_page_dir,page))
  File "/Users/adamg/PycharmProjects/NLP-HW1/craiger.py", line 15, in __init__
    self.page = open(page_file).read()
  File "/usr/local/Cellar/python3/3.4.2_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 6646: ordinal not in range(128)

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

在Python 3中,csv想要文本,所以不要给它字节(文件打开为'rb')。如果文件不是ascii文本,则必须对其进行解码:

with open(training_pages_list_file, encoding='iso-8859-1') as f:

或该CSV文件中使用的其他任何编码名称。

如果是python 2,import codecs并且类似地使用codecs.open而不是内置open(在py2中可以处理编码/解码)。或者等效地import io并使用io.open

与其他open类似 - 您需要告知它每个页面文件的编码。

如果您不知道哪个文件使用哪种编码,那么您就会遇到麻烦,因为您可以做的最好的就是猜测;一个体面的猜测者是https://pypi.python.org/pypi/chardet,但 仍然只是猜测。

就像一个二进制数据文件,没有关于如何布局其记录的信息,编码的文本文件没有关于编码的信息是一个真正可怕的想法,并且你&#39;我需要一些侦探/考古/法医工作,还有一点运气。