lxml unicode字符

rya*_*yan 5 python encoding lxml

我是lxml和python的新手.我正在尝试解析一个HTML文档.当我使用标准的xml解析器进行解析时,它会正确地写出字符,但我认为它无法解析,因为我无法使用xpath进行搜索.

正在解析的示例文件:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>title</title>
</head>
<body>
    <span id="demo">Garbléd charactérs</span>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

解析代码:

from lxml import etree

fname = 'output/so-help.html'

# parse
hparser = etree.HTMLParser()
htree   = etree.parse(fname, hparser)

# garbled
htree.write('so-dumpu.html', encoding='utf-8')

# targets
demo_name = htree.xpath("//span[@id='demo']")

# garbled
print 'name: "' + demo_name[0].text
Run Code Online (Sandbox Code Playgroud)

终端输出:

name: "Garbléd charactérs
Run Code Online (Sandbox Code Playgroud)

htree.write输出:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>title</title></head><body>
    <span id="demo">Garbléd charactérs</span>
</body></html>
Run Code Online (Sandbox Code Playgroud)

Emi*_*l M 9

问题是你试图编码已编码的数据,你需要的是让解析器用utf-8解码数据.*在原始代码中尝试demo_name [0] .text.decode('utf-8'),你会看到

正确的方法:

from lxml import etree

fname = 'output/so-help.html'

# parse
hparser = etree.HTMLParser(encoding='utf-8')
htree   = etree.parse(fname, hparser)

# garbled
htree.write('so-dumpu.html')

# targets
demo_name = htree.xpath("//span[@id='demo']")

# garbled
print 'name: "' + demo_name[0].text
Run Code Online (Sandbox Code Playgroud)