Как исправить символ торговой марки, вызывающий ошибку «cp950» при записи файла в Python 3? - PullRequest
0 голосов
/ 24 мая 2018

Я извлекаю текст с веб-страницы и записываю содержимое в файл:

import requests
from inscriptis import get_text
from bs4 import BeautifulSoup

page = requests.get(r'http://www3.asiainsurancereview.com//News/View-NewsLetter-Article/id/42528/Type/eDaily/Technology-First-round-of-the-pre-launch-of-the-Ydentity-ICO-starts-today')
soup = BeautifulSoup(page.text, 'lxml')
html = soup.find(class_='article-wrap')
text = get_text(html.text)
print(text)

articleFile = open('test.txt', 'w')
articleFile.write(text)
articleFile.close()

Он печатает содержимое на экране очень хорошо, но выдает ошибку Unicode при записи содержимого в файл:

UnicodeEncodeError                        Traceback (most recent call last)
<ipython-input-67-859d4647d5eb> in <module>()
     10 
     11 articleFile = open('test.txt', 'w')
---> 12 articleFile.write(text)
     13 articleFile.close()

UnicodeEncodeError: 'cp950' codec can't encode character '\u2122' in position 51: illegal multibyte sequence

При выводе содержимого на консоль я увидел, что в статье есть некоторые символы товарных знаков (TM).Итак, я попытался сделать это:

text=text.encode("utf-8")

но я все еще получаю ошибку, хотя и другую:

TypeError                                 Traceback (most recent call last)
<ipython-input-68-3f30355ab29c> in <module>()
     12 text=text.encode("utf-8")
     13 
---> 14 articleFile.write(text)
     15 
     16 articleFile.close()

TypeError: write() argument must be str, not bytes

Я пробовал следующее, нобезрезультатно:

text = get_text(html.text)

from unidecode import unidecode
def remove_non_ascii(text):
    return unidecode(str(text, encoding = "utf-8"))

articleFile = open('test.txt', 'w')
articleFile.write(text)
articleFile.close()

Выдает следующую ошибку:

TypeError                                 Traceback (most recent call last)
<ipython-input-70-ff7e6a098308> in <module>()
     20 
     21 
---> 22 articleFile.write(remove_non_ascii(text))
     23 
     24 articleFile.close()

<ipython-input-70-ff7e6a098308> in remove_non_ascii(text)
      9 from unidecode import unidecode
     10 def remove_non_ascii(text):
---> 11     return unidecode(str(text, encoding = "utf-8"))
     12 
     13 articleFile = open('test.txt', 'w')

TypeError: decoding str is not supported

Я также пробовал это:

if isinstance(text, str):
    text = text
else:
    text = text.decode(encoding)
    decoded = True

articleFile.write(text)
articleFile.close()

, и это дает исходную ошибку (такв принципе ничего не делает):

UnicodeEncodeError                        Traceback (most recent call last)
<ipython-input-71-f0c817f013af> in <module>()
     20 
     21 
---> 22 articleFile.write(text)
     23 
     24 articleFile.close()

UnicodeEncodeError: 'cp950' codec can't encode character '\u2122' in position 51: illegal multibyte sequence

как это исправить?

1 Ответ

0 голосов
/ 24 мая 2018

Я нашел решение, чтобы открыть файл для записи в двоичном режиме, а затем кодировать символы Unicode:

articleFile = open('test.txt', 'wb')
text=text.encode("utf-8")
articleFile.write(text)
articleFile.close()

Очевидно, Python не может записывать закодированный текст Unicode в файлесли записываемый файл не открыт в двоичном режиме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...