Кодирование UTF-8 не работает при получении текста Xpath - PullRequest
0 голосов
/ 30 августа 2018

Я получаю некоторую дату с веб-сайта через lxml xpath:

page = requests.get(url)

tree = html.fromstring(page.content)

titles_arr = tree.xpath("//span[@class='lister-item-header']/span/a/text()")

В некоторых заголовках есть немецкий Umlaute (например, üöä), поэтому я подумал о кодировании возвращенного текста следующим образом:

for title in titles_arr:
    title = title.encode('utf-8')

но он по-прежнему состоит из Der Herr der Ringe - Die R\u00fcckkehr des K\u00f6nigs вместо соответствующего символа Юникода. Что я делаю не так?

Спасибо

1 Ответ

0 голосов
/ 31 августа 2018

Вы, похоже, имеете дело со строкой байтов, закодированной с экранированными символами Юникода.

Вы можете декодировать так:

>>> bs = b'Die R\u00fcckkehr des K\u00f6nigs'
>>> bs.decode('raw-unicode-escape')
'Die Rückkehr des Königs'

Если вы имеете дело с текстом, а не с байтами, вам необходимо кодировать, а затем декодировать:

>>> s = 'Die R\u00fcckkehr des K\u00f6nigs'                                                                                                                                                                                               
>>> s.encode('latin-1').decode('raw-unicode-escape')                                                                           
'Die Rückkehr des Königs' 

Этот тип кодировки используется для экранирования символов юникода в json, чтобы ограничить значения json ascii:

>>> json.dumps('Die Rückkehr des Königs')
'"Die R\\u00fcckkehr des K\\u00f6nigs"'   

, поэтому возможно, что любой URL, который вы выбираете, является html со встроенным json, или json со встроенным html - возможно, стоит проверить атрибут json ответа.

...