lxml.etree提供的用於增量解析的方式有如下兩種:框架
方式一url
經過file-like對象不斷的調用read()方法spa
當數據源是從urllib 或其餘file-like對象時,推薦使用該方式
注意,在這種狀況下,解析器將阻塞並等待數據變爲可用code
from lxml import etree class DataSource: data = [ b"<roo", b"t><", b"a/", b"><", b"/root>" ] def read(self, requested_size): try: return self.data.pop(0) except IndexError: return b'' tree = etree.parse(DataSource()) print(etree.tostring(tree)) #輸出:b'<root><a/></root>'
方式二xml
經過feed(data)和close()方法提供的feed解析器接口對象
該方法能夠隨時中斷解析過程,稍後再調用feed()方法繼續解析
若是但願避免阻塞對解析器的調用,例如在twisted之類的框架中,或者當數據以緩慢的速度或塊的形式出現時
而且但願在等待下一個塊時執行其餘操做,那麼這將很是有用
在調用close()方法以後(或者當解析器引起異常時),能夠經過再次調用其feed()方法來重用解析器blog
from lxml import etree parser = etree.XMLParser() parser.feed("<roo") parser.feed("t><") parser.feed("a/") parser.feed("><") parser.feed("/root>") root = parser.close() print(etree.tostring(root)) #輸出:b'<root><a/></root>' parser.feed("<root/>") root = parser.close() print(etree.tostring(root)) #輸出:b'<root/>'