«UnicodeEncodeError: код« charmap »c не может закодировать символ» при записи в csv с помощью Webscraper - PullRequest
0 голосов
/ 22 апреля 2020

Я написал webscraper, который очищает данные о бейсболе NBA от Баскетбольная ссылка . Указанная c веб-страница, на которой происходит моя ошибка:

UnicodeEncodeError: 'charmap' codec can't encode character '\u0107' in position 11: character maps to <undefined>

, здесь . И, наконец, указанные c данные игрока, которые запускают его и выдают этот указанный c UnicodeEncodeError, равны этому (хотя я уверен, что ошибка является более обобщенной и будет произведена с любым символом, который содержит непонятный знак ударения).

Минимальный воспроизводимый код:

def get_boxscore_basic_table(tag): #used to only get specific tables
    tag_id = tag.get("id")
    tag_class = tag.get("class")
    return (tag_id and tag_class) and ("basic" in tag_id and "section_wrapper" in tag_class and not "toggleable" in tag_class)

import requests
from bs4 import BeautifulSoup
import lxml
import csv
import re

website = 'https://www.basketball-reference.com/boxscores/202003110MIA.html'

r = requests.get(website).text
soup = BeautifulSoup(r, 'lxml')

tables = soup.find_all(get_boxscore_basic_table)

in_file = open('boxscore.csv', 'w', newline='')
csv_writer = csv.writer(in_file)
column_names = ['Player','Name','MP','FG','FGA','FG%','3P','3PA','3P%','FT','FTA','FT%','ORB','DRB','TRB','AST','STL','BLK','TOV','PF','PTS','+/-']
csv_writer.writerow(column_names)

for table in tables:    
    rows = table.select('tbody tr')

    for row in rows:
        building_player = [] #temporary container to hold player and stats
        player_name = row.th.text 
        if 'Reserves' not in player_name: 
            building_player.append(player_name)

        stats = row.select('td.right')

        for stat in stats:
            building_player.append(stat.text)

        csv_writer.writerow(building_player) #writing to csv

in_file.close()

Как лучше всего обойти это?

Я видел кое-что в Интернете об изменении кодировки и, в частности, об использовании метода .encode('utf-8') в строке перед записью в csv, но кажется, что это метод .encode (), хотя он останавливает ошибку из будучи брошенным, имеет несколько своих проблем. Например; player_name.encode('utf-8') перед записью в csv превращает имя 'Willy Hernangómez' в 'b'Willy Hernang \ xc3 \ xb3mez' 'в пределах csv ... не совсем шаг в правильном направлении.

Любая помощь в этом и объяснение того, что происходит, будет высоко ценится!

1 Ответ

0 голосов
/ 22 апреля 2020

используйте

in_file = open('boxscore.csv', 'w', newline='',  encoding='utf-8')

вместо

in_file = open('boxscore.csv', 'w', newline='')

и сохраняйте все то же самое. Убедитесь, что вы открываете Excel в кодировке utf-8

...