не могу заставить мой скрипт python заменить \u коды

Я обрабатываю HTML-файлы в локальном каталоге, созданном на веб-сайте, выполняя разработку в Notepad ++ в Windows 10. Эти файлы утверждают, что это «utf-8», но в них много кода сценария. При записи в файл я могу получить коды \u#### и коды \x## и мусорные символы, но не полный человеческий код. В основном коды ’ не конвертируются, но некоторые другие тоже не учитываются.

with open(self.srcFilename, 'r', encoding='utf8') as f:
        self.rawContent = f.read()
        f.close()                    
soup = BeautifulSoup(self.rawContent, 'lxml')
:::: <<<=== other tag processing code
for section in soup.find('article'):
            nextNode = section           
            if soup.find('article').find('p'):
                ::: <<<=== code to walk through tags
                if tag_name == "p":
                    storytags.append(nextNode.text)                        
                ::: <<<=== conditions to end loop        
i=1
for line in storytags:
    print("[line %d] %s" % (i, line))
    logger.write("[line %d] %s\n" % (i, line))
    i+=1
setattr(self, 'chapterContent', storytags)    

Без кодировки utf-8 я получаю сообщение об ошибке

File "C:\Python\Python36\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 52120: character maps to <undefined>

Таким образом, прочитанный файл использует кодировку utf-8. Если я выполняю консольную печать, из приведенного выше раздела она печатается читабельно/разборчиво (?). Однако запись в файл дает мне мусорные символы, такие как They’ve вместо They've и “Let’s вместо "Let's.

После долгих чтений самое близкое к тому, чтобы получить удобочитаемый вывод, — это изменить оператор write(), но у меня все еще остаются случайные коды.

(1) logger.write("[line %d] %s\n" % (i, line.encode('unicode_escape').decode()))
(2) logger.write("[line %d] %s\n" % (i, line.encode().decode('utf-8)))

Первый оператор дает мне текст, а также коды \u#### и несколько кодов \xa0. Второй оператор создает HTML-файл с текстом, который я могу прочитать в HTML-браузере, но \u2019 по-прежнему неправильно интерпретируется компоновщиком epub Caliber. Я попытался использовать этот вопрос/решение, но это не так. распознать код \u.

Есть ли возможное решение или есть какие-то указания, как лучше справиться с моей проблемой?

РЕДАКТИРОВАТЬ: Забыл добавить, пишу with open('log.txt', 'w+'):. Раньше я использовал encoding='utf-8', но это, казалось, делало его хуже.


person Meghan M.    schedule 22.10.2018    source источник
comment
Не уверен, как кто-то может помочь вам, учитывая приведенное выше описание. Если вы работаете с файлами, которые утверждают, что имеют кодировку «utf-8», но могут и не быть, вам нужно выяснить, как вы хотите с этим справиться (исправить исходные файлы, каким-то образом обработать неверную кодировку... и т. д.) . Но без доступа к файлам никому было бы трудно порекомендовать решение.   -  person user2263572    schedule 22.10.2018
comment
Надеялся получить несколько предложений по кодированию/декодированию с помощью line, чтобы помочь с отладкой. Что-то вроде for c in line: print("%s, ord(%d)" % (c, ord(c)) с некоторыми более вероятными вариантами кодирования/декодирования. Я в лучшем случае нечастый программист и новичок в python.   -  person Meghan M.    schedule 22.10.2018


Ответы (1)


Неделю искал и наконец нашел ответ после публикации здесь, Удаление юникодных … символов в строке в python2.7. Кстати, я работаю на Python 3.6, поэтому это не связано с версией Python.

with open(output, 'w+') as out:
    ::: <<<=== code
    line = line.encode('utf-8').decode('ascii','ignore')`
    out.write(line)

Мне все еще нужно работать с вариантами (output, 'w+') с кодировкой и без нее. Во всяком случае ... это, наконец, дало мне наилучшие результаты.

person Meghan M.    schedule 22.10.2018
comment
Еще одна полезная статья для отладки проблем с кодировкой. stackoverflow.com/questions/13106175/ - person Meghan M.; 22.10.2018