<p>如果对UTF-8的编码结果是<code>b'\xc2\x9ea'</code>,那么这意味着原始字符串是<code>'\x9ea'</code>。不管是lxml没有正确地完成任务,还是在您的端上发生了什么(可能是解析器配置问题),事实是您得到了与此等价的结果(python3.x语法):</p>
<pre><code>>>> '\x9ea'.encode('utf-8')
b'\xc2\x9ea'
</code></pre>
<p>你怎么修好的?一种容易出错的方法是将其编码为可以正确处理字符的UTF-8以外的代码。它很容易出错,因为虽然某些东西在一种情况下可能有效,但在另一种情况下可能不起作用。相反,您可以通过映射字符序数来提取字符序数,并改为使用字符序数:</p>
^{pr2}$
<p>因为<code>bytes</code>类型有一个<code>fromhex</code>方法,可以将包含十六进制值的字符串解码为等效的字节值:</p>
<pre><code>>>> bytes.fromhex(''.join(map((lambda n: hex(n)[2:]), map(ord, '\x9ea'))))
b'\x9ea'
</code></pre>
<p>您可以在结果上使用<code>decode('cp1250')</code>来得到<code>ža</code>,我相信这就是您想要的字符串。如果您使用的是python2.x,那么等效的</p>
<pre><code>from binascii import unhexlify
unhexlify(u''.join(map((lambda n: hex(n)[2:]), map(ord, u'\x9ea'))))
</code></pre>
<p>请注意,这是极具破坏性的,因为它强制将Unicode字符串中的所有字符解释为字节。因此,它只应用于包含适合单个字节的Unicode字符的字符串。如果有类似<code>'\x9e\u724b\x61'</code>的代码,则该代码将导致将<code>['9e', '724b', '61']</code>连接为<code>'9e724b61'</code>,并解释使用单字节字符集(如CP1250)将产生类似<code>'žrKa'</code>的结果。在</p>
<p>出于这个原因,更可靠的代码将用一个函数来替换<code>ord</code>,如果<code>0 <= ord(ch) < 0x100</code>为false,则抛出一个异常,但我将留给您编写代码。在</p>