【问题标题】:lxml not parsing unicode properly for HTMLlxml 没有为 HTML 正确解析 unicode
【发布时间】:2015-05-17 09:47:47
【问题描述】:

我正在尝试解析 HTML,但不幸的是 lxml 不允许我获取实际文本:

node = lxml.html.fromstring(r.content)
self.fingerprint['Title'] = node.cssselect('.document-title div')[0].text
print '@@####', self.fingerprint['Title']

# @@#### Démineurs

我需要做什么才能正确解析此文本?这是网页:https://play.google.com/store/movies/details/D%C3%A9mineurs?id=KChu8wf5eVo&hl=fr,文字应该是 Démineurs。

【问题讨论】:

    标签: python unicode lxml


    【解决方案1】:

    文档没有编码信息,因此需要创建一个默认使用正确编码的解析器。

    >>> lxml.html.fromstring('<p>é</p>').text
    u'\xc3\xa9'
    >>> hp = lxml.etree.HTMLParser(encoding='utf-8')
    >>> lxml.html.fromstring('<p>é</p>', parser=hp).text
    u'\xe9'
    

    【讨论】:

      【解决方案2】:

      这只是一个编码问题。

      看起来您正在使用requests,这很好,因为它可以为您工作。

      首先是requests guesses at the encoding,您可以使用r.encoding 访问它。对于该页面,请求猜测为 utf-8。

      可以做:

      data = r.content.decode('UTF-8')
      # or
      data = r.content.decode(r.encoding)
      # then
      node = lxml.html.fromstring(data)
      self.fingerprint['Title'] = node.cssselect('.document-title div')[0].text
      print '@@####', self.fingerprint['Title']
      

      哪个有效:

      @@#### Démineurs
      

      但更好的是,只需使用text 属性,它的输出已经正确解码。

      node = lxml.html.fromstring(r.text)
      self.fingerprint['Title'] = node.cssselect('.document-title div')[0].text
      print '@@####', self.fingerprint['Title']
      

      作品:

      @@#### Démineurs
      

      【讨论】:

      • r.textr.content 有什么区别?
      • @Hockey127 请求将原始输出存储在content 中,它还对编码“做出有根据的猜测”并对输出进行解码,并将其存储在text 中。你几乎总是想要text
      • @jedwards:有根据的猜测归结为:解析content-type 标头以获取charset 参数。如果缺失并且mime-type是text/*,则使用Latin-1,否则使用chardet猜测。
      • @MartijnPieters 嗯,听起来它非常依赖适当的网络服务器配置。允许网络服务器(至少是 apache)提供错误的字符集非常容易。我无法确定这是一个缺点还是足够的猜测。
      • @jedwards:这就是为什么我建议忽略来自服务器的字符集并使用 BeautifulSoup 的检测(如果存在,它将获取 HTML &lt;meta&gt; 标头)。
      猜你喜欢
      • 2016-05-30
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2011-02-19
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      相关资源
      最近更新 更多