python - lxml:从 HTML 中提取 unicode 文本

标签 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\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/

相关文章:

C++ 字符串 : UTF-8 or 16-bit encoding?

java - 阔叶 UTF-8 编码

python - 绘制序列及其反向互补图

python - 高效查找两个列表之间的元素差异

python - Google Analytics 数据到 Pandas Dataframe

python - 使用 Python 2.x unicodecsv 时出现 UnicodeDecodeError

string - Swift 字符串比较使用哪种规范化?

java - Android:显示从文件中读取的西类牙语(以及其他)字符

python - 将路径、文件名、ext 字符串分成三个单独的变量的最稳定和Pythonic 跨平台方法是什么?

javascript - 使用 Unicode 分割字符串