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/>'