Проблемы с кодировкой urllib2 / lxml - PullRequest
0 голосов
/ 11 декабря 2010

Я новичок в python и пытаюсь использовать urllib2 / lxml для извлечения и анализа страницы.Кажется, что все работает нормально, за исключением того, что в разобранной странице, когда она открывается в моем браузере, в нее встроены странные символы.Я предполагаю, что это проблема разбора Unicode / lxml.Когда я получаю текстовое содержимое элемента, используя .text_content (), и печатаю его, я получаю что-то вроде: «sometext \ 342 \ 200 \ 223 moretext» на исходной странице, это отображается как «sometext - moretext»

Может кто-нибудь сказать мне:
1. Что происходит?
2. Как это исправить?
3. Где я могу прочитать о таких проблемах кодирования?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 11 декабря 2010

Что происходит, так это то, что на сайте используется «endash», который немного длиннее (и тот, который вы должны использовать в диапазонах, например, 40-56). Да, тире - это целая наука сама по себе).

В Unicode у endash есть кодовая точка U + 2013.Полученные числа, \ 342 \ 200 \ 223, являются восьмеричным представлением кодировки UTF-8 этой кодовой точки.Почему вы получаете восьмеричное, я не знаю, я получаю hex, поэтому на моем компьютере это выглядит как '\ xe2 \ x80 \ x93'.Но это не имеет значения, это просто представление.Числа одинаковы.

Что вам, вероятно, следует сделать, это как можно раньше декодировать строку HTML, которую вы получите, в Unicode.Заголовки, которые вы получаете, когда получаете страницу, должны указывать, какую кодировку она использует (хотя здесь, по-видимому, UTF8), извлечь эти данные из заголовков довольно просто, вы увидите это, когда распечатаете заголовки.

Затем вы декодируете HTML-данные:

htmldata = htmldata.decode(<the encoding you found in the headers>)
0 голосов
/ 11 декабря 2010

В основном вам нужно помнить о проблемах с юникодом в двух моментах процесса:

  1. Получите ответ в виде строки в юникоде, хорошо объясненной здесь на SO
  2. Укажите подходящую кодировку при выводе строк

-

#  from an lxml etree
etree.tostring(root, encoding='utf-8', xml_declaration=False)

# from a unicode string
x.encode('utf-8')
...