lxml:从HTML中提取unicode文本

时间:2013-08-22 14:50:34

标签: python unicode encoding lxml lxml.html

更新
我的代码在大多数希伯来语页面上工作正常,但是在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 \ xa8 \ xd7 \ xa9 \ xd7 \ xa8 \ xd7 \ xaa(1955-1954)' - 将unicode编码为常规文本串;但不是:
3. u'\ xd7 \ x9e \ xd7 \ xa9 \ xd7 \ xa8 \ xd7 \ 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 。我需要切换吗? (我不想......)

1 个答案:

答案 0 :(得分:1)

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