Lxml试图用windows1250字符提取数据

2024-09-28 20:17:19 发布

您现在位置:Python中文网/ 问答频道 /正文

您好,我正在试验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:]

我收到的回复是这样的:

^{pr2}$

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

那么我该怎么做呢?我试着用“windows-1250”代替utf8,但没有成功。我能把代码转换成原始字符吗?在


Tags: 数据texttreeparser网页newtitlewindows
2条回答

如果对UTF-8的编码结果是b'\xc2\x9ea',那么这意味着原始字符串是'\x9ea'。不管是lxml没有正确地完成任务,还是在您的端上发生了什么(可能是解析器配置问题),事实是您得到了与此等价的结果(python3.x语法):

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

你怎么修好的?一种容易出错的方法是将其编码为可以正确处理字符的UTF-8以外的代码。它很容易出错,因为虽然某些东西在一种情况下可能有效,但在另一种情况下可能不起作用。相反,您可以通过映射字符序数来提取字符序数,并改为使用字符序数:

^{pr2}$

因为bytes类型有一个fromhex方法,可以将包含十六进制值的字符串解码为等效的字节值:

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

您可以在结果上使用decode('cp1250')来得到ža,我相信这就是您想要的字符串。如果您使用的是python2.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)将产生类似'žrKa'的结果。在

出于这个原因,更可靠的代码将用一个函数来替换ord,如果0 <= ord(ch) < 0x100为false,则抛出一个异常,但我将留给您编写代码。在

尝试:

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

输出

^{pr2}$

在你的数据库里保存漂亮的字符。在

相关问题 更多 >