2011-09-07 66 views
3

我使用python ElementTree来读取和修改我的html文件的一些内容。当我完成更改并使用ElementTree.write函数时,它会添加额外的html:所有标签的infront。我应该如何避免这种情况?python ElementTree写函数

2)它还增加了&我有特殊字符。我应该如何避免这种情况?

谢谢 Divya。

+0

这可能有一些帮助吗? http://stackoverflow.com/questions/780334/unescape-python-strings-from-http – Louis

回答

1

你不行。 ElementTree通过加载XML,解析它并仅存储抽象表示来工作。它写道,出来一串步行抽象表示,但它不记得的东西哪些字符被转义为实体或元素是否被存储为<foo/><foo></foo>(HTML:<foo><foo></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() 

这可能需要更多的工作,以不破坏原输入。查看文档以了解所有内容。

+0

非常感谢你的回复。是的,经过这么多的研究后,我也发现我无法使用ElementTree来完成我的工作。 – Divya

+0

你能解释一下如何使用sgmllib获取html文件中标签之间的文本。请用一些代码exaplin,以便我能理解。我对这个库很陌生,所以请帮助我。 – Divya

+0

@Divya我加了一个例子。 –