Lxml尝试使用windows-1250字符提取数据

时间:2015-11-06 23:34:18

标签: python lxml

您好我正在尝试使用Python和LXML,我仍然遇到从网页中提取数据的问题,该网页包含ž和ć等Windows-1250字符。

tree = html.fromstring(new.text,parser=hparser)
title = tree.xpath('//strong[text()="Title"]')
opis[g] = opis[g].tail.encode('utf-8')[2:]

我收到包含以下内容的文字回复:

\xc2\x9ea

而不是字符。然后我有存储到数据库的问题

那我怎么能做到这一点?我试过把'windows-1250'代替utf8而没有成功。我能以某种方式将此代码转换为原始字符吗?

2 个答案:

答案 0 :(得分:0)

<强>尝试:

text = "\xc2\x9ea"
print text.decode('windows-1250').encode('utf-8')

<强>输出

ža

并在数据库中保存好的字符。

答案 1 :(得分:0)

如果编码为UTF-8会产生b'\xc2\x9ea',则表示原始字符串为'\x9ea'。无论lxml是否做得不正确,或者你的结果发生了什么(可能是解析器配置问题),事实是你得到了相同的东西(Python 3.x语法):

>>> '\x9ea'.encode('utf-8')
b'\xc2\x9ea'

你是如何解决的?一种容易出错的方法是编码为UTF-8以外的其他可以正确处理字符的东西。它容易出错,因为虽然某个案例可能在一个案例中起作用,但在另一个案例中可能不起作用。你可以通过映射字符序号来提取字符序号,而不是使用字符序列:

>>> list(map((lambda n: hex(n)[2:]), map(ord, '\x9ea')))
['9e', '61']

由于bytes类型有一个fromhex方法可以将包含十六进制值的字符串解码为等效字节值,因此我们可以将它们放到某处:

>>> bytes.fromhex(''.join(map((lambda n: hex(n)[2:]), map(ord, '\x9ea'))))
b'\x9ea'

您可以使用decode('cp1250')获得ža的结果,我相信这是您想要的字符串。如果您使用的是Python 2.x,那么等价物将是

from binascii import unhexlify
unhexlify(u''.join(map((lambda n: hex(n)[2:]), map(ord, u'\x9ea'))))

请注意,这是非常具有破坏性的,因为它会强制将Unicode字符串中的所有字符解释为字节。因此,它只应用于包含适合单个字节的Unicode字符的字符串。如果您有类似'\x9e\u724b\x61'的内容,那么该代码会导致['9e', '724b', '61']加入'9e724b61',并且使用CP1250这样的单字节字符集解释该代码会导致{{1} }}

出于这个原因,如果'žrKa'为false,更可靠的代码会将ord替换为抛出异常的函数,但我会留给您代码。