[英]How do I fetch an XML document and parse it with Python twisted?
我想要一种快速的方法来获取URL并在流式传输时解析它。 理想情况下,这应该是超快的。 我选择的语言是Python。 我有一种直觉,扭曲可以做到这一点,但我找不到一个例子。
如果您需要以流方式处理HTTP响应,则有几个选项。
你可以通过downloadPage
来做到:
from xml.sax import make_parser
from twisted.web.client import downloadPage
class StreamingXMLParser:
def __init__(self):
self._parser = make_parser()
def write(self, bytes):
self._parser.feed(bytes)
def close(self):
self._parser.feed('', True)
parser = StreamingXMLParser()
d = downloadPage(url, parser)
# d fires when the response is completely received
这是有效的,因为downloadPage
将响应主体写入传递给它的类文件对象。 在这里,使用write
和close
方法传入对象满足该要求,但是逐步将数据解析为XML而不是将其放在磁盘上。
另一种方法是在HTTPPageGetter
级别挂钩。 HTTPPageGetter
是getPage
内部使用的协议。
class StreamingXMLParsingHTTPClient(HTTPPageGetter):
def connectionMade(self):
HTTPPageGetter.connectionMade(self)
self._parser = make_parser()
def handleResponsePart(self, bytes):
self._parser.feed(bytes)
def handleResponseEnd(self):
self._parser.feed('', True)
self.handleResponse(None) # Whatever you pass to handleResponse will be the result of the Deferred below.
factory = HTTPClientFactory(url)
factory.protocol = StreamingXMLParsingHTTPClient
reactor.connectTCP(host, port, factory)
d = factory.deferred
# d fires when the response is completely received
最后,很快就会有一个新的HTTP客户端API。 由于这不是任何版本的一部分,它不像前两种方法那样直接有用,但它更好一些,所以我会把它包含在内,让你了解未来会带来什么。 :)新API允许您指定接收响应正文的协议。 所以你会做这样的事情:
class StreamingXMLParser(Protocol):
def __init__(self):
self.done = Deferred()
def connectionMade(self):
self._parser = make_parser()
def dataReceived(self, bytes):
self._parser.feed(bytes)
def connectionLost(self, reason):
self._parser.feed('', True)
self.done.callback(None)
from twisted.web.client import Agent
from twisted.internet import reactor
agent = Agent(reactor)
d = agent.request('GET', url, headers, None)
def cbRequest(response):
# You can look at the response headers here if you like.
protocol = StreamingXMLParser()
response.deliverBody(protocol)
return protocol.done
d.addCallback(cbRequest) # d fires when the response is fully received and parsed
您只需解析一个URL? 然后别担心。 使用urllib2打开连接并将文件句柄传递给ElementTree。
您可以尝试的变体是使用ElementTree的增量解析器或使用iterparse,但这取决于您的实际需求。 有“超级快”,但也“足够快”。
只有当你开始有多个同时连接时,你应该看看Twisted或多线程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.