更新:
我的代码在大多数希伯来语页面上运行良好,但在其中 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。我必须切换吗? (我不想...)
最佳答案
可能(但在没有数据的情况下很难确定),该页面是 UTF-8 编码的,但 HTML 解析器默认为 iso-8859-1(与默认为 UTF-8 的 XML 解析器相反)
关于python - lxml:从 HTML 中提取 unicode 文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18383840/