您好我正在尝试使用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而没有成功。我能以某种方式将此代码转换为原始字符吗?
答案 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
替换为抛出异常的函数,但我会留给您代码。