python ElementTree写函数

2024-09-28 19:04:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用pythonelementtree来读取和修改html文件的一些内容。当我完成了改变和使用元素树.write功能

1)在所有标记的前面添加额外的html:。我该怎么避免呢?在

2)它还添加了&;我有特殊字符的地方。我该怎么避免呢?在

谢谢你, 迪维亚。在


Tags: 文件标记功能元素内容html地方write
1条回答
网友
1楼 · 发布于 2024-09-28 19:04:04

你不能。ElementTree的工作原理是加载XML,解析它,并且只存储一个抽象表示。它通过遍历抽象表示将其写入字符串,但它不记得哪些字符作为实体转义,或者某个元素是存储为<foo/>还是{}(HTML:<foo>或{})

现在,由于ElementTree只对XML(而不是HTML)起作用,我猜您在本例中使用的是lxml.html,它实际上会自动更正某些形式的错误HTML,因为否则它将无法正确地存储它。在

处理HTML的正确方法是在标记中获取它的数据,这些标记可以记住它们的原始表示形式。我已经用sgmllib完成了这项工作,但这并不完美,例如,有一个get_starttag_text方法来获得开始标记的精确内容,但没有对应的结束标记方法。不管怎样,这可能已经足够好了。在

例如,要写出删除所有段落的HTML,可以这样编写函数:

from cStringIO import StringIO

class SGMLModifier(sgmllib.SGMLParser):
    def __init__(self, *args, **kwargs):
        sgmllib.SGMLParser.__init__(self, *args, **kwargs)
        self._file = StringIO()

    def getvalue(self):
        return self._file.getvalue()

    def start_b(self, attributes):
        # skip it
        pass

    def end_b(self):
        # skip it
        pass

    def unknown_starttag(self, tag, attributes):
        self._file.write(self.get_starttag_text())

    def unknown_endtag(self, tag):
        # we can't get this verbatim.
        self._file.write('</%s>' % tag)

    def handle_comment(self, comment):
        # no verbatim here either.
        self._file.write('<!  %s  >' % comment)

    def handle_data(self, data):
        self._file.write(data)

    def convert_entityref(self, ref):
        return '&' + ref + ';'

def remove_bold(html):
    parser = SGMLModifier()
    parser.feed(html)
    return parser.getvalue()

这可能需要更多的工作才能不损坏输入。查看文档以了解所有细节。在

相关问题 更多 >