Кодирование китайских символов в Python и TypeError: требуется объект, похожий на байты, а не 'str'

Привет, ребята, я написал веб-скребок в Python, пытаясь отсканировать несколько примеров слов и т. Д. С веб-сайта словаря для моего списка слов GRE и поместить их в CSV-файл. Соскоб содержание включает в себя китайские иероглифы.

Единственная проблема в моем сценарии - когда я пытаюсь записать их в файл CSV, я могу получить ошибку

UnicodeEncodeError: кодек "ascii" не может кодировать символы в позиции 13-15: порядковый номер не в диапазоне (128)

или же

TypeError: требуется байтоподобный объект, а не 'str'

Вот мой полный код:

#!/usr/bin/python
# -*- coding: <encoding name> -*-

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup

# make a word list (grabbed from the wordlist pdf, converted to Excel and extracted)

wordList = '''Day One
abandon
abate
abbreviate
Day Two
abate
abbreviate
Day Three
abandon
abate
Day Four
abandon
abate
abandon
abate
Day Five
abandon
abate
Day Six
abandon
abate
Day Seven
abandon
abate'''

wordList = [y for y in (x.strip() for x in wordList.splitlines()) if y]

dayIndex = 0
dayArray = ['Day One', 'Day Two', 'Day Three', 'Day Four', 'Day Five', 'Day Six', 'Day Seven']

for item in wordList:
        if item == dayArray[dayIndex]:
                if dayIndex == 0:
                        fileName = "Word " + dayArray[dayIndex] + ".csv"
                        f = open(fileName, 'w')
                        headers = "word, separater, detail, lineSep\n"
                        f.write(headers)
                        dayIndex += 1
                elif dayIndex == 6:
                        f.close()
                else:
                        f.close()
                        fileName = "Word " + dayArray[dayIndex] + ".csv"
                        f = open(fileName, 'w')
                        headers = "word, separater, detail, lineSep\n"
                        f.write(headers)
                        dayIndex += 1
        else:
                # construct url for each word
                myUrl = 'http://gre.kmf.com/vocab/detail/' + item

                # opening up the connection, grabbing the page
                uClient = uReq(myUrl)
                page_html = uClient.read()
                uClient.close()

                # html parsing
                pageSoup = soup(page_html, "html.parser")

                # grab word container
                container = pageSoup.findAll("div", {"class", "word-d-maintile"})
                contain = container[0]# actually only 1 item in the container array

                # grab the word(should be the same as item)
                word = contain.span.text

                # grab word detail
                wordDetail_container = contain.findAll("div", {"class": "word-g-translate"})
                wordDetail = wordDetail_container[0].text.strip()# again should be only 1 item in the array.strip() the extra spaces and useless indentation

                # manipulate the string wordDetail(string is immutable but you know what I mean)
                detailArray = []
                for letter in wordDetail:
                        if letter != '【' and letter != '例' and letter != '近' and letter != '反':
                            detailArray.append(letter)
                        elif letter == '【':
                            detailArray.append("\n\n\n" + letter)
                        else:
                            detailArray.append("\n\n" + '[' + letter + ']' + ' ')
                        newWordDetail = ''.join(detailArray)
                #print("CUT\n") debug
                #print(word + '\n') debug
                #print(newWordDetail) debug
                f.write(word +',' + '&' + ',' + newWordDetail.replace(',', 'douhao') + ',' + '$')

Проблема в последней строке. Когда возникает первая ошибка, я добавляю ".encode('gb2312')" после того, как newWordDetail пытается кодировать эти китайские символы, но после этого я получил вторую ошибку. Я проверил онлайн, но вряд ли нашел решение, подходящее для моей ситуации.

Спасибо, ребята, за спасение моей жизни!

1 ответ

你的代码, 写成了面条式代码, 造成有的情况下, 文件关闭了, 不能写.

f.write(word + ',' + '&' + ',' +newWordDetail.replace(',', 'douhao') + ',' + '$')

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

#!/usr/bin/env python
# coding:utf-8
'''黄哥Python'''


from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup

# make a word list (grabbed from the wordlist pdf, converted to Excel and
# extracted)

wordList = '''Day One
abandon
abate
abbreviate
Day Two
abate
abbreviate
Day Three
abandon
abate
Day Four
abandon
abate
abandon
abate
Day Five
abandon
abate
Day Six
abandon
abate
Day Seven
abandon
abate'''

wordList = [y for y in (x.strip() for x in wordList.splitlines()) if y]

dayIndex = 0
dayArray = ['Day One', 'Day Two', 'Day Three',
            'Day Four', 'Day Five', 'Day Six', 'Day Seven']

for item in wordList:
    if item == dayArray[dayIndex]:
        if dayIndex == 0:
            fileName = "Word " + dayArray[dayIndex] + ".csv"
            f = open(fileName, 'w')
            headers = "word, separater, detail, lineSep\n"
            f.write(headers)
            dayIndex += 1
        elif dayIndex == 6:
            f.close()
        else:
            f.close()
            fileName = "Word " + dayArray[dayIndex] + ".csv"
            f = open(fileName, 'w')
            headers = "word, separater, detail, lineSep\n"
            f.write(headers)
            dayIndex += 1
    else:
        # construct url for each word
        myUrl = 'http://gre.kmf.com/vocab/detail/' + item

        # opening up the connection, grabbing the page
        uClient = uReq(myUrl)
        page_html = uClient.read()
        uClient.close()

        # html parsing
        pageSoup = soup(page_html, "html.parser", )

        # grab word container
        container = pageSoup.findAll("div", {"class", "word-d-maintile"})
        contain = container[0]  # actually only 1 item in the container array

        # grab the word(should be the same as item)
        word = contain.span.text

        # grab word detail
        wordDetail_container = contain.findAll(
            "div", {"class": "word-g-translate"})
        # again should be only 1 item in the array.strip() the extra spaces and
        # useless indentation
        wordDetail = wordDetail_container[0].text.strip()

        # manipulate the string wordDetail(string is immutable but you know
        # what I mean)
        detailArray = []
        for letter in wordDetail:
            if letter != '【' and letter != '例' and letter != '近' and letter != '反':
                detailArray.append(letter)
            elif letter == '【':
                detailArray.append("\n\n\n" + letter)
            else:
                detailArray.append("\n\n" + '[' + letter + ']' + ' ')
            newWordDetail = ''.join(detailArray)
        # print("CUT\n") debug
        # print(word + '\n') debug
        # print(newWordDetail) debug
        # print(f)
        try:
            f.write(word + ',' + '&' + ',' +newWordDetail.replace(',', 'douhao') + ',' + '$')
        except Exception as e:
            pass

Слово, разделитель, деталь, lineSep. Оставить, &,

【考 法 1】 п. Care : беззаботная свобода от ограничений

[例] добавить специи в рагу с полным отказом 肆无忌惮 地 向 炖菜 里面 加 调料

[近] безудержный douhao неограниченный douhao безудержный

【考法2】v. To : безгранично отдавать себя

[例] отдай себя эмоциям ‖ ‖ отдай себя жизни полной безделья 她 放纵 自己 过着 闲散 的 生活

[近] потворствовать сдаче

【考法3】v. To : часто уходить от опасности или посягательств

[例] покинуть корабль / дома 弃船 ; 离家

[反] спасение 救援

【考 法 4】 v. To 做某事: положить конец (чему-то запланированному или предварительно согласованному)

[例] Плохая погода вынудила НАСА отказаться от запуска. 坏天气迫使NASA停止了发射.

[近] abortdouhao dropdouhao repealdouhao rescinddouhao revokedouhao вызвать offdouhao сдаться

[反] keepdouhao continueouhao maintaindouhao продолжай 继续,$ abate, &,

【考 法 1】 v. 减轻 (程度 或者 强度) : уменьшить степень или интенсивность

[例] ослабить его ярость / боль 平息 他 的 愤怒 / 减轻 他 的 痛苦

[近] модерируемый, ты отступил, ты отступил, ты умрёшь, ты умрёшь (убегает или убегает), доухо даёт фазу обновления, даундухао сужается

[反] усилить 加强 , 加剧

【考法2】v. 减少 (数量) , 降低 (价值) : для уменьшения количества или стоимости

[例] уменьшить налог 降低 税收

[近] de-escalatedouhao depletedouhao downscaledouhao dwindledouhao ratchet (вниз)

[反] augmentdouhao продвигать 增加

【考法3】v. To , 撤销: положить конец

[例] уменьшить неприятность 停止 伤害

[近] аннулировано, что вы аннулировали, вы сделали недействительным, вы ничего не сделали,$ $

Другие вопросы по тегам