UnicodeEncodeError: кодек ascii не может кодировать символ u'’' в позиции 6: порядковый номер не в диапазоне (128)

Я пытаюсь получить список из 500 ресторанов Амстердама с TripAdvisor; однако после 308-го ресторана я получаю следующую ошибку:

Traceback (most recent call last):
  File "C:/Users/dtrinh/PycharmProjects/TripAdvisorData/LinkPull-HK.py", line 43, in <module>
    writer.writerow(rest_array)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 6: ordinal not in range(128)

Я попробовал несколько вещей, которые нашел на StackOverflow, но пока ничего не работает. Мне было интересно, может ли кто-нибудь взглянуть на мой код и увидеть какие-либо потенциальные решения, которые были бы замечательными.

        for item in soup2.findAll('div', attrs={'class', 'title'}):
            if 'Cuisine' in item.text:
                item.text.strip()
                content = item.findNext('div', attrs=('class', 'content'))
                cuisine_type = content.text.encode('utf8', 'ignore').strip().split(r'\xa0')
        rest_array = [account_name, rest_address, postcode, phonenumber, cuisine_type]
        #print rest_array
        with open('ListingsPull-Amsterdam.csv', 'a') as file:
                writer = csv.writer(file)
                writer.writerow(rest_array)
    break

person dtrinh    schedule 15.11.2016    source источник
comment
cuisine_type - это список, потому что вы используете .split (и я не уверен, почему вы разбиваете на неразрывные пробелы...). Однако содержимое строки, которую вы передаете .writerow, должно быть строками или числами. Кроме того, при использовании модуля Python 2 csv вы должны открывать файлы CSV в двоичном режиме, как указано в документы. Вам может быть полезна эта статья: Pragmatic Unicode, написанная ветераном SO Недом Батчелдером.   -  person PM 2Ring    schedule 16.11.2016


Ответы (3)


rest_array содержит строки Unicode. Когда вы используете csv.writer для записи строк, вам нужно сериализовать строки байтов (вы используете Python 2.7).

Я предлагаю вам использовать кодировку "utf8":

with open('ListingsPull-Amsterdam.csv', mode='a') as fd:
    writer = csv.writer(fd)
    rest_array = [text.encode("utf8") for text in rest_array]
    writer.writerow(rest_array)

примечание: пожалуйста, не используйте file в качестве переменной, потому что вы затеняете встроенную функцию file() (псевдоним функции open()).

Если вы хотите открыть этот CSV-файл в Microsoft Excel, вы можете рассмотреть возможность использования другой кодировки, например «cp1252» (она позволяет использовать символ «u»’).

person Laurent LAPORTE    schedule 15.11.2016

Вы пишете символы, отличные от ascii, в выходной файл csv. Убедитесь, что вы открываете выходной файл с соответствующей кодировкой символов, которая позволяет кодировать символы. Безопасной ставкой часто является UTF-8. Попробуй это:

with open('ListingsPull-Amsterdam.csv', 'a', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(rest_array)

редактировать это для Python 3.x, извините.

person Irmen de Jong    schedule 15.11.2016
comment
Я думаю, у него не будет этой ошибки на Python 3. Его вопрос помечен python-2.7. - person Laurent LAPORTE; 16.11.2016

Добавьте эти строки в начало вашего скрипта

import sys
reload(sys)
sys.setdefaultencoding('utf-8')
person Rahul Prasad    schedule 12.02.2021