Веб-утилита Python возвращает "кодек charmap" не может закодировать символ " - PullRequest
0 голосов
/ 15 января 2019
import bs4 as bs
import urllib.request
import re
import os
from colorama import Fore, Back, Style, init

init()

def highlight(word):
    if word in keywords:
      return Fore.RED + str(word) + Fore.RESET
    else:
      return str(word)

for newurl in newurls:
 url = urllib.request.urlopen(newurl)
 soup1 = bs.BeautifulSoup(url, 'lxml')
 paragraphs =soup1.findAll('p')
 print (Fore.GREEN + soup1.h2.text + Fore.RESET)
 print('')
 for paragraph in paragraphs:
    if paragraph != None:
        textpara = paragraph.text.strip().split(' ')
        colored_words = list(map(highlight, textpara))
        print(" ".join(colored_words).encode("utf-8")) #encode("utf-8")
    else:
        pass

У меня будет список ключевых слов и URL для прохождения. После запуска нескольких ключевых слов в URL я получаю вывод, подобный этому

b'\x1b[31mthe desired \x1b[31mmystery corners \x1b[31mthe differential . 
\x1b[31mthe back \x1b[31mpretends to be \x1b[31mthe'

Я удалил кодирование ("utf-8") и получаю ошибку кодирования

Traceback (most recent call last):
 File "C:\Users\resea\Desktop\Python Projects\Try 3.py", line 52, in 
 <module>
   print(" ".join(colored_words)) #encode("utf-8")
  File "C:\Python34\lib\site-packages\colorama\ansitowin32.py", line 41, in 
   write
  self.__convertor.write(text)
   File "C:\Python34\lib\site-packages\colorama\ansitowin32.py", line 162, 
   in write
    self.write_and_convert(text)
   File "C:\Python34\lib\site-packages\colorama\ansitowin32.py", line 190, 
  in write_and_convert
  self.write_plain_text(text, cursor, len(text))
  File "C:\Python34\lib\site-packages\colorama\ansitowin32.py", line 195, in 
   write_plain_text
  self.wrapped.write(text[start:end])
   File "C:\Python34\lib\encodings\cp850.py", line 19, in encode
   return codecs.charmap_encode(input,self.errors,encoding_map)[0]
   UnicodeEncodeError: 'charmap' codec can't encode character '\u2019' in 
   position 23: character maps to <undefined>

Куда я иду не так?

1 Ответ

0 голосов
/ 16 января 2019

Я знаю, что я собираюсь предложить, это скорее обходной путь, чем «решение», но я снова и снова разочаровывался всевозможными странными персонажами, с которыми приходилось сталкиваться «кодировать это» или «закодировать это», иногда успешно, а часто нет.

В зависимости от типа текста, используемого в newurl, совокупность проблемных символов, вероятно, ограничена. Поэтому я имею дело с ними в каждом конкретном случае: каждый раз, когда я получаю одну из этих ошибок, я делаю это:

import unicodedata
unicodedata.name('\u2019')

В вашем случае вы получите это:

'RIGHT SINGLE QUOTATION MARK'

Старая, надоедливая, правильная одинарная кавычка ... Итак, , как предлагается здесь , я просто заменяю этот надоедливый символ другим, который похож на него, но не вызывает ошибку; в вашем случае

colored_words = list(map(highlight, textpara)).replace(u"\u2019", "'") # or some other replacement character

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

...