2024-09-28 19:04:04 发布
网友
我使用pythonelementtree来读取和修改html文件的一些内容。当我完成了改变和使用元素树.write功能
1)在所有标记的前面添加额外的html:。我该怎么避免呢?在
2)它还添加了&;我有特殊字符的地方。我该怎么避免呢?在
谢谢你, 迪维亚。在
你不能。ElementTree的工作原理是加载XML,解析它,并且只存储一个抽象表示。它通过遍历抽象表示将其写入字符串,但它不记得哪些字符作为实体转义,或者某个元素是存储为<foo/>还是{}(HTML:<foo>或{})
<foo/>
<foo>
现在,由于ElementTree只对XML(而不是HTML)起作用,我猜您在本例中使用的是lxml.html,它实际上会自动更正某些形式的错误HTML,因为否则它将无法正确地存储它。在
处理HTML的正确方法是在标记中获取它的数据,这些标记可以记住它们的原始表示形式。我已经用sgmllib完成了这项工作,但这并不完美,例如,有一个get_starttag_text方法来获得开始标记的精确内容,但没有对应的结束标记方法。不管怎样,这可能已经足够好了。在
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()
这可能需要更多的工作才能不损坏输入。查看文档以了解所有细节。在
你不能。ElementTree的工作原理是加载XML,解析它,并且只存储一个抽象表示。它通过遍历抽象表示将其写入字符串,但它不记得哪些字符作为实体转义,或者某个元素是存储为}(HTML:})
<foo/>
还是{<foo>
或{现在,由于ElementTree只对XML(而不是HTML)起作用,我猜您在本例中使用的是lxml.html,它实际上会自动更正某些形式的错误HTML,因为否则它将无法正确地存储它。在
处理HTML的正确方法是在标记中获取它的数据,这些标记可以记住它们的原始表示形式。我已经用sgmllib完成了这项工作,但这并不完美,例如,有一个
get_starttag_text
方法来获得开始标记的精确内容,但没有对应的结束标记方法。不管怎样,这可能已经足够好了。在例如,要写出删除所有段落的HTML,可以这样编写函数:
这可能需要更多的工作才能不损坏输入。查看文档以了解所有细节。在
相关问题 更多 >
编程相关推荐