etree.tostring为带有“»”的文本提供奇怪的符号

时间:2014-07-14 13:10:31

标签: python-2.6 elementtree

以下是代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-
from lxml import etree

def str_repr(el, enc='utf-8'):
    doctype = ''
    text = etree.tostring(el, pretty_print=True, method='html', encoding=enc)
    text = doctype+text
    return text

def clear_scripts(text):
    parser = etree.HTMLParser()
    tree = etree.parse(StringIO.StringIO(text), parser)

    return str_repr(tree.getroot())

text = '''»'''

text_final  = clear_scripts(text)

问题是text_final中没有sybmol »,但是»(整行是<html><body><p>»</p></body></html>

为什么会这样?如何只留下符号»

2 个答案:

答案 0 :(得分:0)

创建HTML解析器时,它不知道要解析文本的编码,也不知道默认为UTF-8。您可以通过替换

来解决此问题
parser = etree.HTMLParser()

parser = etree.HTMLParser(encoding="utf-8")

您也想告诉浏览器这一点,如果您将脚本的输出视为HTML,您仍会在许多浏览器中看到乱码文本,因为默认情况下它们不会指望utf-8。您生成的HTML应包含head部分,如下所示:

<head><meta charset="utf-8"></head>

答案 1 :(得分:0)

文本应该是unicode字符串

text = u'»'