2016-11-15 4 views
4

Я пытаюсь вытащить список из 500 ресторанов в Амстердаме от TripAdvisor; Однако после того, как в 308-м ресторана я получаю следующее сообщение об ошибке:UnicodeEncodeError: кодек 'ascii' не может кодировать символ u ' u2019' в позиции 6: порядковый номер не в диапазоне (128)

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 
+0

'kitchen_type' - это список, потому что вы используете' .split' (и я не уверен, почему вы раскалываетесь на неперерывных пространствах ...). Однако содержимое строки, передаваемой в '.writerow', должно быть строками или цифрами. Кроме того, при использовании модуля Python 2 'csv' вы должны открывать CSV-файлы в двоичном режиме, как указано в [docs] (https://docs.python.org/2/library/csv.html) , Вы можете найти эту статью полезной: [Pragmatic Unicode] (http://nedbatchelder.com/text/unipain.html), которая была написана ветеранкой SO Нед Батчелдер. –

ответ

4

rest_array содержит строки в Юникоде. Когда вы используете 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 «\ u2019»).

+0

Это работало как шарм! Спасибо! – dtrinh

1

Вы пишете символ не-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, извините.

+0

Я думаю, что у него не будет этой ошибки на Python 3. Его вопрос помечен 'python-2.7'. –

+0

Ты прав, пропустил это –