Как исправить ошибку "UnicodeEncodeError: кодек 'ascii' не может кодировать символ u '\ xa0' в позиции 3656: порядковый номер не в диапазоне (128)" в Python - PullRequest
0 голосов
/ 30 марта 2019

Я пишу код для сканирования расписания учеников со школьного сайта с помощью Beautifulsoup.Проблема в том, что у меня постоянно возникает ошибка UnicodeError: кодек ascii не может кодировать символ u '\ xa0' в позиции 3656: порядковый номер не в диапазоне (128), и я не могу его разрешить.

import urllib2
from bs4 import BeautifulSoup
import os

def make_soup(url):
    thepage = urllib2.urlopen(url)
    soupdata = BeautifulSoup(thepage, "html.parser")
    return soupdata

timetabledatasaved = ""
soup = make_soup("http://timetable.ait.ie/reporting/textspreadsheet;student+set;id;AL%5FKSWFT%5FR%5F5%0D%0A?t"
             "=student+set+textspreadsheet&days=1-5&weeks=21-32&periods="
             "3-20&template=student+set+textspreadsheet")

for record in soup.find_all('tr'):
    timetabledata = ""
    print record
    print '--------------------'
    for data in record('td'):
        timetabledata = timetabledata + "," + data.text
    if len(timetabledata) != 0:
        timetabledatasaved = timetabledatasaved + "\n" + timetabledata[1:]

#print timetabledatasaved

header = "Activity, Module, Type, Start, End, Duration, Weeks, Room, Staff, Student Groups"
file = open(os.path.expanduser("timetable.csv"), "wb")
file.write(bytes(header).encode("utf-8", errors="ignore"))
file.write(bytes(timetabledatasaved).encode("utf-8", errors="ignore"))

Я использовал Utf-8, но он все еще дает мне эту ошибку после сканирования расписания.Опять же, я понял, что мой код, кажется, сканирует даже javascript-коды на странице, но я хочу, чтобы он только распечатывал соответствующие данные расписания и сохранял их в виде файла .csv.

Traceback (most recent call last):
  File "/Users/tobenna/PycharmProjects/final_project/venv/timetable_scrape.py", line 30, in <module>
    file.write(bytes(timetabledatasaved).encode("utf-8", errors="ignore")) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 3656: ordinal not in range(128)

Process finished with exit code 1

1 Ответ

1 голос
/ 30 марта 2019

bytes в Python 2 является синонимом str, поэтому, вызывая bytes() для ваших значений, вы кодируете их как ASCII, который не может обрабатывать такие символы, как '\xa0'. Кодируйте значения напрямую:

file.write(header.encode("utf-8", errors="ignore"))
file.write(timetabledatasaved.encode("utf-8", errors="ignore"))
...