【问题标题】:lxml: extracting unicode text from HTMLlxml:从 HTML 中提取 unicode 文本
【发布时间】:2013-08-25 09:13:12
【问题描述】:

更新:
我的代码在大多数希伯来语页面上都可以正常工作,但在其中 10% 上都失败了。我很不幸从两个“坏”的开始。
这是一个“好”页面的示例:http://m.sport5.co.il/Pages/Article.aspx?articleId=154765,
这是一个“坏”的:http://www.havoda.org.il/Web/Default.aspx.
坏的还是要处理的,还不知道怎么处理……

原问题:
我正在使用 lxml.html 来解析 HTML,并且只提取文本(稍后用于文本分类)。我无法正确处理 unicode(在我的例子中是希伯来文)。

树元素的编码似乎不正确:
当我查看 element[i].text 时,type(element[i].text) = UnicodeType,我看到类似这样的内容: "u'\xd7\x9e\xd7\xa9\xd7\x94 \xd7\xa9\xd7\xa8\xd7\xaa ( 1955-1954)'",这是不对的——这个实体不能被编码或解码! (或者我还没有找到如何......)打印它当然会带来这样的东西:“×ש×שרת(1955-1954)”,那就是不是希伯来语...

一个可行的文本字符串应该如下所示:
1. u'\u05de\u05e9\u05d4 \u05e9\u05e8\u05ea (1955-1954)' - 一个正确的unicode字符串;或:
2. '\xd7\x9e\xd7\xa9\xd7\x94 \xd7\xa9\xd7\xa8\xd7\xaa (1955-1954)' - Unicode 编码成常规的文本字符串;但不是:
3. u'\xd7\x9e\xd7\xa9\xd7\x94 \xd7\xa9\xd7\xa8\xd7\xaa (1955-1954)' - 一个无用的混合实体('ascii'编解码器无法解码字节...)

我该怎么做才能解决它?我究竟做错了什么?这是我正在使用的代码:

import lxml.html as lh
from types import *

f = urlopen(url)
html = f.read()
root = lh.fromstring(html)

all_elements = root.cssselect('*')
all_text = ''
for i in range(len(all_elements)):
  if all_elements[i].tag not in ['script','style']:
    if type(all_elements[i].text) in [StringType, UnicodeType]:
      all_text = all_text + all_elements[i].text.strip() + ' '

纯英文(非 unicode)html 一切正常。

这里几乎所有的答案都是指lxml.etree,而不是我正在使用的lxml.html。我必须切换吗? (我不想……)

【问题讨论】:

  • 我建议使用lxml.html.tostring(your_element, method="text", encoding=unicode),在控制台的[] 中打印输出。如果输出没问题,你就得到了你的 unicode 文本。如果不是,可能 HTML 中声明的编码是错误的。在这种情况下,您需要在解析时对其进行修复,方法是将 encoding='the-real-encoding' 参数传递给您提供给 lh.fromstring(html, parser=lxml.html.HTMLParser(encoding='the-real-encoding')) 的解析器实例
  • 如果您有一个指向您正在使用的示例 HTML 页面的链接,那也会很有帮助
  • 按照@Steven 的回答,尝试lh.fromstring(html, parser=lxml.html.HTMLParser(encoding='utf8'))
  • @pault。这是示例:havoda.org.il/Web/Default.aspx。看来我的代码适用于大多数希伯来语页面,例如:m.sport5.co.il/Pages/Article.aspx?articleId=154765,但我仍然需要处理这些坏的。我更新了问题。 (谢谢,抱歉回复延迟)
  • havoda.org.il/Web/Default.aspx 的源代码看起来主要是 JavaScript 的 blob。我认为通过使用 lxml 将其解析为 HTML,您不会从该页面中获得任何有用的信息。也许你可以使用 Selenium 或 PhantomJS 之类的东西。

标签: python unicode encoding lxml lxml.html


【解决方案1】:

可能(但如果没有数据很难确定),页面是 UTF-8 编码的,但 HTML 解析器默认为 iso-8859-1(与默认为 UTF-8 的 XML 解析器相反)

【讨论】:

  • 确实,u'מש'u'\u05de\u05e9'(有问题的示例文本“1”的前 2 个字符)并编码为 UTF8 为 '\xd7\x9e\xd7\xa9'
  • 这是数据:havoda.org.il/Web/Default.aspx。看来我的代码适用于大多数希伯来语页面,例如:m.sport5.co.il/Pages/Article.aspx?articleId=154765,但我仍然需要处理这些不好的页面。我更新了问题。
猜你喜欢
  • 2016-05-11
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多