2015-12-17 1 views
-1

Я знаю, что этот тип вопроса был избит до смерти. Я читал все, что мог найти, я понимаю проблему (или, по крайней мере, думаю, что знаю), и я до сих пор не могу понять, что здесь происходит. Эта проблема повторяется и сводит меня с ума.Кодирующий ад - u2019 не будет отображаться

Одним из примеров является выскабливание федеральных праздников от: https://www.opm.gov/policy-data-oversight/snow-dismissal-procedures/federal-holidays/'

Если я пытаюсь напечатать текст таблицы данных, возвышенные дроссели (не выход), и PowerShell дает мне ошибку кодирования (не может кодировать \ 2019 - который является правильным апострофом). Заголовки на веб-сайте говорят, что UTF-8, который запрашивает правильное определение и использование в качестве кодировки (requests.get(url).encoding), так что я немного не понимаю. Хотя я могу понять, что PowerShell терпит неудачу, поскольку он использует более узкий стандарт Unicode (cp437 IIRC), я не понимаю, как возвышенное отображение не выводится, поскольку оно по умолчанию используется для UTF-8 afaik.

Вот простой простой пример, где base_url является основным URL, указанным выше (или любым последующим годом после того, как вы находитесь на исходной странице). FWIW У меня эти проблемы почти исключительно на Windows, которые я должен использовать для работы.

def get_year(url): 
    source = requests.get(url,proxies=proxies) 
    doc = html.fromstring(source.text) 
    td=doc.xpath('//td/text()') 
    return td 

print(get_year(base_url)) 
+0

Вы правы, что-нибудь кодировка UTF-8 должна всегда удается. Можете ли вы показать полный стек ошибок? –

+0

Вы пытались изменить кодировку ответа на запрос? то есть 'source.encoding = 'utf-8'' –

+0

Если вы кодируете строку самостоятельно, вы можете установить политики« игнорировать »или« заменить ». Я не знаю, как изменить кодировщик для 'print', но (скорее всего, хромым, но функциональным) решением может быть' print (get_year (base_url) .encode (sys.stdout.encoding, errors = 'replace'). Decode (sys.stdout.encoding)) '. – tdelaney

ответ

1

Смотрите здесь то, что я сделал:

import urllib 

url = 'https://www.opm.gov/policy-data-oversight/snow-dismissal-procedures/federal-holidays/' 

data = urllib.urlopen(url).read() 
udata = unicode(data,'utf-8') 

EDIT НАЧАТЬ

После жалоб об использовании urllib, то же самое с requests, без разницы, конечно:

source = requests.get(url) 
udata = source.text 

EDIT END

Ошибок кодирования или каких-либо других проблем нет. Я искал символы, отличные от ASCII. Существует только один: \xA0 по индексу 53513.

Нет \2019 персонаж там! Тем не менее, есть ’, что и означает.

Итак, кажется, что одна из библиотек, которые вы используете, преобразовала ’ в \2019, но с неправильным кодированием, создавая, таким образом, недопустимую строку. Позже он врезался в другое место. Все это произошло после загрузки. Вы должны отслеживать, что происходит с загруженными данными, чтобы увидеть, какая функция это сделала. Затем посмотрите, что говорит об этом в документации.

EDIT 2 НАЧАТЬ

После первоначального кода Аль путь до конца, я пришел к тому месту, где последняя строка print(get_year(base_url)) вызывает исключение.

Проверка, что, по-видимому, что, как предполагается выше, lxml конвертированы ’ в \2019, так что мы имеем:

>>> s = get_year(base_url)[1] 
>>> s 
u'New Year\u2019s Day' 

печати, что консоль не работает, если кодировка в консоли не поддерживает \u2019 характер. В окнах это часто бывает.

EDIT 2 END

+0

На какой машине вы тестировали? Это была командная строка Windows с кодовой страницей Windows вместо utf-8? Вы можете проверить 'print (sys.stdout.encoding)'. – tdelaney

+1

Вопрос очень специфичен в использовании 'запросов', почему вы пытаетесь дублировать проблему, используя' urllib'? –

+0

@MarkRansom Я отредактировал свой ответ. Нет никакой разницы с 'запросами'. – zvone

Смежные вопросы