【发布时间】: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