2011-09-07 65 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我加了一個例子。 –