Как я могу декодировать эту строку, которая представлена ​​как Unicode? - PullRequest
0 голосов
/ 26 июня 2018

Я получаю s при попытке разобрать веб-страницу по читабельности (Python 2.7 в Windows 10, Sublime Text 2 / cmd)

>>> import requests
>>> from readability import Document
>>>
>>> response = requests.get('http://www.gamersky.com/news/201806/1064930.shtml')
>>> doc = Document(response.text.encode("utf-8"))
>>> print doc.title()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'gbk' codec can't encode character u'\xe3' in position 0: illegal multibyte sequence
>>> print doc.title().encode("utf-8")
lots of messy codes
>>> print doc.title().encode("utf-16")
lots of messy codes
>>> print doc.title().encode("gbk")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'gbk' codec can't encode character u'\xe3' in position 0: illegal multibyte sequence

Я обнаружил, что никогда не смогу распечатать doc.title(),поэтому я посмотрел в doc.title(), запустив

s = repr(doc.title())
print type(doc.title())
print s

Результат очень странный

<type 'unicode'>
u'\xe3\x80\x8a\xe5\xa5\x87\xe5\xbc\x82\xe4\xba\xba\xe7\x94\x9f\xe3\x80\x8b\xe5\x9b\xa2\xe9\x98\x9f\xe6\x96\xb0\xe4\xbd\x9c\xe3\x80\x8a\xe8\xb6 \xe8\x83\xbd\xe9\x98\x9f\xe9\x95\xbf\xe3\x80\x8b\xe5 \x8d\xe8\xb4\xb9\xe4\xb8\x8b\xe8\xbd\xbd \xe5\xb0\x8f\xe7\x94\xb7\xe5\xad\xa9\xe7\x9a\x84\xe8\x8b\xb1\xe9\x9b\x84\xe6\xa2\xa6\xe6\x83\xb3 _ \xe6\xb8\xb8\xe6\xb0\x91\xe6\x98\x9f\xe7\xa9\xba GamerSky.com'

Кажется, что s на самом деле кодируется в многобайтовых, потому что когда я запускаю

 print '\xe3\x80...'

И он печатает

《奇异人生》团队新作《? 能队长》? ?费下载 小男孩的英雄梦想 _ 游民星空 GamerSky.com

Где точный заголовок

《奇异人生》团队新作《超能队长》免费下载 小男孩的英雄梦想 _ 游民星空 GamerSky.com

Хотя некоторые символы по-прежнему отсутствуют, но результат убеждает меня, что \xe3 не должен быть представлен в форме Unicode.После некоторых поисков я обнаружил, что следующий код помогает, но все еще есть некоторые пропущенные символы.

>>> print s.encode("raw_unicode_escape")
《奇异人生》团队新作《? 能队长》? ?费下载 小男孩的英雄梦想 _ 游民星空 GamerSky.com

Мои вопросы:

  1. Почему эта проблема, вероятно, происходит?Является ли решение encode("raw_unicode_escape") аккуратным?Когда я запускаю следующие коды, это работает

    >>> import requests
    >>> from readability import Document
    >>>
    >>> response = requests.get('https://zh.wikipedia.org/wiki/Wikipedia:%E9%A6%96%E9%A1%B5')
    >>> doc = Document(response.text.encode("utf-8"))
    >>> print doc.title()
    维基百科,自由的百科全书
    
  2. Как обрабатывать пропущенные символы?

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Проблема в том, что когда вы используете response.text, он делает предположение, что такое кодировка при декодировании response.content в юникод.В этом случае его предположение неверно.Вы должны форсировать кодировку, установив response.encoding в 'utf-8', в соответствии с документацией .

import requests
from readability import Document
response = requests.get('http://www.gamersky.com/news/201806/1064930.shtml')
response.encoding = 'utf-8'
doc = Document(response.text)
print doc.title()

И это печатает:

《奇异人生》团队新作《超能队长》免费下载 小男孩的英雄梦想 _ 游民星空 GamerSky.com
0 голосов
/ 26 июня 2018

Попробуйте использовать response.content

Пример:

>>> import requests
>>> from readability import Document
>>>
>>> response = requests.get('http://www.gamersky.com/news/201806/1064930.shtml')
>>> doc = Document(response.content)
>>> print doc.title()
...