Я обрабатываю 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'
, но это, казалось, делало его хуже.
line
, чтобы помочь с отладкой. Что-то вродеfor c in line: print("%s, ord(%d)" % (c, ord(c))
с некоторыми более вероятными вариантами кодирования/декодирования. Я в лучшем случае нечастый программист и новичок в python. - person Meghan M.   schedule 22.10.2018