2016-06-15 4 views
4

У меня есть список, который содержит содержимое lxml.etree._ElementStringResult и lxml.etree._ElementUnicodeResultСнизить дает ошибку при цикл работает нормально

for x in contents: 
     final_content += (x.encode('utf-8')) + '\n' 

и

final_content = reduce(lambda a, x: a+x.encode('utf-8') + '\n', contents) 

Первый код работает нормально, а второй код вызывает ошибку декодирования в юникоде.

<ipython-input-129-17a363dfff6c> in <lambda>(a, x) 
----> 1 final_content = reduce(lambda a, x: a+x.encode('utf-8') + '\n', contents) 

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 
37: ordinal not in range(128) 

Редактировать:

Уменьшить терпит неудачу, потому что первый элемент не кодируется.

Когда я изменил код

final_content = contents[0] 
for x in range(1,len(contents)): 
    final_content += contents[x].encode('utf-8') 

Это поднимает ту же ошибку, как и уменьшить блок выше.

+2

Отключить тему: 'final_content = u '\ n'.join ([x.encode (' utf-8 ') для x в содержимом])' – danihp

+0

@bhargav Этот вопрос касается проблем с сокращением, а не кодированием. – StrawhatLuffy

+0

@ danihp Этот комментарий был предназначен для модов, которые закрыли вопрос как дубликат. – StrawhatLuffy

ответ

1

Ошибка в том, что ваш \n не является кодировкой utf-8. Просто установка, чтобы быть строка Юникода должна решить проблему:

final_content = reduce(lambda a, x: a + x.encode('utf-8') + u'\n', contents) 

Sorry «владелец» ответ о редактировании здесь свой вопрос без вашего разрешения, но вопрос закрыт, и я не могу отправить правильный ответ. Вы можете удалить это содержимое:

Op, вы предполагаете, что оба кода имеют одинаковое поведение, но это не так! Поскольку на первой итерации карты вы соединяете первый и второй элементы без \n. И вы делаете это кодирование второго элемента, но без кодирования первого. Правильный перевод с вашей классическим for петли для вашего reduce подхода является:

final_content = reduce(lambda a, x: 
          a+x.encode('utf-8') + u'\n', 
         contents, 
         u'\n') # <----- initializer 

Обратите внимание, что без инициализатора вы делаете:

contents[0] + contents[1].encode('utf-8') 

и это то, что вызывает ошибку!

+2

Он все еще поднимает ту же ошибку. – StrawhatLuffy

+1

обновлен после ^^ комментарий. – danihp

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