首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lxml unicode字符

lxml unicode字符
EN

Stack Overflow用户
提问于 2012-03-06 06:05:54
回答 3查看 7.9K关注 0票数 6

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

正在解析的示例文件:

代码语言:javascript
复制
<!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>

解析代码:

代码语言:javascript
复制
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

终端输出:

代码语言:javascript
复制
name: "Garbléd charactérs

htree.write输出:

代码语言:javascript
复制
<!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>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-06 06:55:33

问题是你试图编码一个已经编码的数据,你需要的是让解析器用utf-8解码数据。*在您的原始代码中尝试demo_name.text.decode('utf-8'),您将看到

正确的做法是:

代码语言:javascript
复制
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
票数 10
EN

Stack Overflow用户

发布于 2012-03-06 06:12:32

尝试更改输出编码:

代码语言:javascript
复制
htree.write('so-dumpu.html', encoding='latin1')

代码语言:javascript
复制
print 'name: "' + demo_name[0].text.encode('latin1')
票数 3
EN

Stack Overflow用户

发布于 2012-03-06 06:26:44

我假设您的XHTML文档是以utf-8编码的。问题是HTML文档中没有指定编码。默认情况下,浏览器和lxml.html假定超文本标记语言文档是按照ISO-8859-1编码的,这就是文档无法正确解析的原因。如果您在浏览器中打开它,它也会显示不正确。

您可以像这样指定文档的编码:

代码语言:javascript
复制
<!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>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>

您可以通过这种方式强制lxml使用编码(就像您可以更改浏览器中使用的编码一样):

代码语言:javascript
复制
file = open(fname)
filecontents = file.read()
filecontents = filecontents.decode("utf-8")
htree = lxml.html.fromstring(filecontents)
print htree.xpath("//span[@id='demo']")[0].text
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9574756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档