Разбор строк UTF-8 / unicode с lxml HTML

Я пытаюсь разобрать с помощью файла etree.HTML () текст, кодированный как UTF-8, без успеха.

python Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05) [GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> from lxml import etree >>> import requests >>> headers = {'User-Agent': "Opera/9.80 (Macintosh; Intel Mac OS X 10.8.0) Presto/2.12.363 Version/12.50"} >>> r = requests.get("http://www.rakuten.co.jp/", headers=headers) >>> r.status_code 200 >>> r.headers {'x-cache': 'MISS from www.rakuten.co.jp', 'transfer-encoding': 'chunked', 'set-cookie': 'wPzd=lng%3DNA%3Acnt%3DCA; expires=Tue, 13-Aug-2013 16:51:38 GMT; path=/; domain=www.rakuten.co.jp', 'server': 'Apache', 'pragma': 'no-cache', 'cache-control': 'private', 'date': 'Mon, 13 Aug 2012 16:51:38 GMT', 'content-type': 'text/html; charset=EUC-JP'} >>> responsetext = r.text 

Все идет нормально. Текст ответа хорош, и это строка в Юникоде. Теперь, если я пытаюсь получить список URI CSS. Никаких проблем.

 >>> tree = etree.HTML(responsetext) >>> csspathlist = tree.xpath('//link[@rel="stylesheet"]/@href') >>> csspathlist ['http://a.ichiba.jp.rakuten-static.com/com/inc/home/20080930/opt/css/normal/common.css?v=1207111500', 'http://a.ichiba.jp.rakuten-static.com/com/inc/home/20080930/opt/css/normal/layout.css?v=1207111500', 'http://a.ichiba.jp.rakuten-static.com/com/inc/home/20080930/opt/css/normal/sidecolumn.css?v=1207111500', 'http://a.ichiba.jp.rakuten-static.com/com/inc/home/20080930/beta/css/liquid/api.css?v=1207111500', '/com/inc/home/20080930/beta/css/liquid/myrakuten_dpgs.css', 'http://a.ichiba.jp.rakuten-static.com/com/inc/home/20080930/opt/css/normal/leftcolumn.css?v=1207111500', 'http://a.ichiba.jp.rakuten-static.com/com/inc/home/20080930/opt/css/normal/header.css?v=1207111500', '/com/inc/home/20080930/opt/css/normal/footer.css', 'http://a.ichiba.jp.rakuten-static.com/com/inc/home/20080930/beta/css/liquid/ipad.css', 'http://a.ichiba.jp.rakuten-static.com/com/inc/home/20080930/opt/css/normal/genre.css?v=1207111500', 'http://a.ichiba.jp.rakuten-static.com/com/inc/home/20080930/opt/css/normal/supersale.css?v=1207111500', '/com/inc/home/20080930/beta/css/liquid/rakuten_membership.css', 'http://a.ichiba.jp.rakuten-static.com/com/inc/home/20080930/beta/css/noscript/set.css?v=1207111500', 'http://a.ichiba.jp.rakuten-static.com/com/inc/home/20080930/beta/css/liquid/suggest-2.0.1.css?v=1204231500', 'http://a.ichiba.jp.rakuten-static.com/com/inc/home/20080930/beta/css/liquid/liquid_banner.css?v=1203011138', 'http://a.ichiba.jp.rakuten-static.com/com/inc/home/20080930/beta/css/liquid/area_announce.css?v=1203011138'] 

Теперь давайте перейдем от unicode к UTF-8 и снова запросим список URI CSS.

 >>> htmltext = responsetext.encode('utf-8') >>> tree2 = etree.HTML(htmltext) >>> csspathlist2 = tree2.xpath('//link[@rel="stylesheet"]/@href') >>> csspathlist2 [] 

Я получаю пустой список.

 >>> etree.tostring(tree2) '<html lang="ja" xmlns="http://www.w3.org/1999/xhtml" xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml"><head><meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"/><meta http-equiv="Content-Style-Type" content="text/css"/><meta http-equiv="Content-Script-Type" content="text/javascript"/><title/></head></html>' 

Действительно, второй разбор остановился сразу после первого японского персонажа в названии.

 <meta http-equiv="Content-Script-Type" content="text/javascript"/> <title> 【楽天市場】Shopping is Entertainment! : インターネット最大級の通信販売、通販オンラインショッピングコミュニティ </title> 

Я все еще пытаюсь понять, что я сделал неправильно.

One Solution collect form web for “Разбор строк UTF-8 / unicode с lxml HTML”

Хорошо, и только что нашел. Часто задавать вопрос о StackOverflow.

etree.HTML() пытается угадать кодировку в соответствии с мета в документе

 <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"/> 

В этом случае я перекодировал документ вручную в utf-8 , а это означает, что это уже не японская кодировка: EUC-JP . Поэтому, чтобы решить проблему, нужно просто заставить анализатор HTML понимать utf-8 . В нашем случае код становится:

 >>> myparser = etree.HTMLParser(encoding="utf-8") >>> tree = etree.HTML(htmltext, parser=myparser) 
  • Что такое строка в Юникоде?
  • Текст Python UTF-8 прибывает на Android
  • Альтернативный синтаксический анализатор XML для ElementTree облегчает проблемы UTF-8?
  • Юникод не поддерживается Python
  • кодировка python urllib2 utf-8
  • Сохранение текстов utf-8 в json.dumps как UTF8, а не как \ u escape-последовательность
  • Почему chardet говорит, что моя кодированная UTF-8 строка (первоначально декодированная из ISO-8859-1) является ASCII?
  • Специальные символы в звуковых устройствах: Pyaudio
  • Как искать и заменять специальные символы utf-8 в Python?
  • python: открыть и прочитать файл, содержащий germanic umlaut, как unicode
  • Pandas df.to_csv ("file.csv" encode = "utf-8") все еще дает символы мусора для знака минус
  •  
    Interesting Posts for Van-Lav

    Каков правильный способ преобразования байтов в шестнадцатеричную строку в Python 3?

    Как мой шаблон хамелеона может принимать сообщения из фрейма пирамиды?

    Запуск интерпретатора Python 3 в PyCharm Community Edition

    Ножницы для рок-бумаги – Python 3 – новичок

    Перенос Django 1.7 не воссоздает упавшую таблицу, почему?

    Использование genfromtxt для импорта данных csv с отсутствующими значениями в numpy

    Предоставление C ++ API для Python

    Выполнять команды sqlite3 «dot» из Python или сортировать регистры в утилите командной строки

    Можете ли вы установить атрибут метода в python

    Обнаруживать, если изображение цветное, полутоновое или черно-белое с Python / PIL

    Python преобразует строковый литерал в float

    Копировать область пикселей

    ReportLab: автоматическое изменение размера текста в соответствии с блоком

    Найти все ключевые элементы по тем же значениям в диктах

    Как преобразовать десятичное число во фракцию?

    Python - лучший язык программирования в мире.