Unicode Ошибка в Windows при записи в Microsoft Excel

Я написал скребок в Python, который сбрасывает данные игрока с сайта futbin.com и записывает его в CSV-файл. Я получаю следующую ошибку, которая возникает на 214 странице, www.futbin.com/17/player/214. Полная обратная связь:

Traceback (most recent call last): File "C:/Users/jona_/PycharmProjects/untitled2/futbin_scraper_2.py", line 94, in <module> writer.writerows([prices_attributes]) File "C:\Program Files\Anaconda3\lib\encodings\cp1252.py", line 19, in encode return codecs.charmap_encode(input,self.errors,encoding_table)[0] UnicodeEncodeError: 'charmap' codec can't encode character '\u015f' in position 145: character maps to <undefined> 

Я подозреваю, что из-за этой части данных на странице: «Beşiktaş JK» (и тому подобное). Я думаю, что странные 'символы не читаются для консоли Windows. Я попытался изменить мою консольную кодировку. В настоящее время он установлен на utf-8, который я проверил, используя:

 $import sys $print(sys.stdin.encoding) output: utf-8 >>> print(sys.stdout.encoding) output: cp437 

Я также попытался установить его в utf-16 с помощью команды set PYTHONIOENCODING=utf-16 , и я установил пакет win-unicode-console, но это не решает мою проблему. Для полноты, я опубликую весь сценарий ниже.

Проблема возникла, когда я добавил строку league = html_tree.xpath('//td/a[@href]/text()', smart_strings=False) . Что сбрасывает данные из таблицы «Информация» в левой части страницы.

Были и другие вопросы, связанные с ошибками в Юникоде, и я честно пробовал каждое решение, которое я мог понять.

Я использую среду IDE для пикармов jetbrains, python 3.5, на окнах 10.

Любая помощь будет оценена


 # # This programme fetches price data and player attributes from the FIFA 17 Ultimate Team Market # And writes them into a .csv file. import csv import requests from lxml import html import time import os.path import sys # # This creates a .csv file in a pre-specified directory to write the player data into # Change: save_path and name_of_file save_path = 'D:/Msc Finance/Thesis/Futbin Data/' name_of_file = ("futbin_data") completeName = os.path.join(save_path, name_of_file+".csv") outfile = open(completeName, "w", newline='', ) # # This generates a list of futbin.com URLs to feed into the script # Change: integers in range() to specify the amount of futbin.com player pages to parse amount_of_players = 16300 list_of_urls = [] for i in list(range(16300)): id = i+1 url = "https://www.futbin.com/17/player/{0}".format(id) list_of_urls.append(url) # # This loop finds all the player data from each url in list_of_urls and stores them into a list for url in list_of_urls: responses = requests.get(url) html_tree = html.fromstring(responses.content) name = html_tree.xpath('//span[@class = "header_name"]/text()', smart_strings=False) prices = html_tree.xpath('//span[@class ="bin_text"]/text()', smart_strings=False) attributes = html_tree.xpath('//td[@class ="table-row-text"]/text()', smart_strings=False) league = html_tree.xpath('//td/a[@href]/text()', smart_strings=False) position = html_tree.xpath('//div[@class ="pcdisplay-pos"]/text()', smart_strings=False) rating = html_tree.xpath('//div[@class ="pcdisplay-rat"]/text()', smart_strings=False) pace = html_tree.xpath('//div[@class ="pcdisplay-ovr1"]/text()', smart_strings=False) shot = html_tree.xpath('//div[@class ="pcdisplay-ovr2"]/text()', smart_strings=False) passing = html_tree.xpath('//div[@class ="pcdisplay-ovr3"]/text()', smart_strings=False) dribble = html_tree.xpath('//div[@class ="pcdisplay-ovr4"]/text()', smart_strings=False) defense = html_tree.xpath('//div[@class ="pcdisplay-ovr5"]/text()', smart_strings=False) physique = html_tree.xpath('//div[@class ="pcdisplay-ovr6"]/text()', smart_strings=False) # This merges all the player data together into one big list prices_attributes = prices + attributes + league + position + rating + pace + shot + passing + dribble + defense + \ physique + name # This removes all instances of \n from the big list prices_attributes = [i.replace('\n', '') for i in prices_attributes] # This removes all blank spaces from the big list prices_attributes = [i.replace(' ', '') for i in prices_attributes] # In some instances the '//td[@class ="table-row-text"]/text()' Xpath from attributes returns an extra empty element # This 'if' statement removes the extra element to ensure all the columns in the .cvs file still align properly if len(prices_attributes) > 40: prices_attributes.pop(25) prices_attributes.pop(30) # # This removes all the remaining empty elements from the big list. Not(12,13,14,24,25,26) because: # Index numbers shift dynamically as the script removes elements from the list if prices_attributes: prices_attributes.pop(11) prices_attributes.pop(11) prices_attributes.pop(11) prices_attributes.pop(20) prices_attributes.pop(20) prices_attributes.pop(20) # Some URLs from list_of_urls no longer exist. These URLs yield empty lists: [] # The 'if' statement below makes sure only non-empty lists are written to the Excel file if prices_attributes: writer = csv.writer(outfile) writer.writerows([prices_attributes]) # This fixes the delay between queries to 0.1 seconds time.sleep(0.1) # This prints the loop's % progress into the Python Console sys.stdout.write("\r%d%%" % ((100/amount_of_players)*(list_of_urls.index(url)+1))) sys.stdout.flush() 

Из вашей трассировки и кода вы используете Python 3 и открываете выходной файл с кодировкой по умолчанию. locale.getpreferredencoding(False) используется по умолчанию, которое в вашем случае – cp1252 . Вместо этого используйте utf-8-sig , но не utf8 . Excel предполагает, что файл без метки байтового байта (BOM) является кодировкой по умолчанию.

В своем коде используйте:

 outfile = open(completeName,'w',newline='',encoding='utf-8-sig') 
  • Макросы VBA MSXML2.XMLHTTP
  • VBA - открытие веб-сайта и сохранение его в качестве расширения .GIF
  • Как проверить частичное совпадение строк в getelementById при очистке
  • Читать изображение с веб-сайта MATLAB
  • Обновить данные XML из Интернета в Excel
  • Заполнение списка for loop для excel с использованием openpyXL
  • Не можем ли мы использовать excel в качестве репозитория объектов для Selenium ..?
  • Как получить ключевые слова в тексте в excel?
  • Веб-запрос Excel для динамических данных
  • R readxl возвращает значения NA из файла Excel
  • Вызов функции внутри цикла «For» вызывает значение NameError
  • Interesting Posts

    Использование findnext с двумя находками

    Жадная сумма в Excel

    Гиперссылка после Vlookup

    Как анализировать XML-файл в VBA

    Скопировать несколько листов в один

    Формула Excel – если значение больше, чем … переместить в следующую ячейку

    Excel VBA – Форматирование «Пятница 27 февраля 08:45:00 CST 2015» в полезную дату

    Преобразование Excel 2007 VBA в Excel 2003

    Как написать, если функция для нескольких строк в таблице веб-сайта HTML

    Как создать резюме с использованием словарей на основе excel с пустыми ячейками с помощью python? (vlookup с python)

    Прочитайте файл Excel и пропустите пустые строки, но не пустые столбцы

    Динамический mnacro сравнивает две таблицы и добавляет строку, если не найден на одной таблице, или обновляет информацию, если найденная строка, но какая-то информация отличается

    Laravel / PHP Excel получает строки до тех пор, пока не вернет пустой массив

    Удалить содержимое исходной книги перед закрытием

    Поиск по диапазону и замена содержимого ячеек, содержащих определенную строку в VBA

    Давайте будем гением компьютера.