2015-03-05 4 views
0

Я прочитал все сообщения об ошибке и до сих пор не могу понять, как отладить мою конкретную проблему.Ошибка BeautifulSoup ascii и csv

Из командной строки я читаю файл 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) 

Как я могу решить эту проблему?

+0

Я думаю, что это может помочь, а также: http://stackoverflow.com/questions/6065329/parsing-inside-a-directory-problem-python-2-7-vs-3-2 – kennes

ответ

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, но, это is все еще только предположение.

Многое, скажем, файл двоичных данных без информации о том, как его записи должны быть выложены, закодированный текстовый файл без информации о кодировке - это поистине страшная идея, и вы будете нуждаются в какой-то детективной/археологической/судебной работе и совсем немного удачи.

+0

Мои текущий код работает для первых нескольких файлов, а затем выходит на 4-й или 5-й. Будет ли это пытаться читать все по-другому? И да, python 3. Я добавлю, что –

+0

Любая особая причина предпочитать 'codecs.open' над' io.open' для 2.6+? –

+0

@Adam_G, не уверен, что это «ваш текущий код» - первый отрывок, который вы даете, терпит неудачу сразу, поэтому он должен быть одним из других, но, разумеется, поскольку вы не говорите нам, что, я не могу догадаться который из. Код, который я даю, просто предполагает, что ваш файл csv использует одну кодировку. Затем сделайте 'open (page_file).read() 'work (трассировка, которую вы даете, не может быть из фрагмента кода, который вы показываете, поэтому еще раз вы заставляете нас угадывать вслепую) аналогичные подходы понадобятся в зависимости от кодировки каждого файла страницы, если они не все используя тот же самый. –

Смежные вопросы