gpt4 book ai didi

python - 如何获取 XML 文档并使用 Python twisted 对其进行解析?

转载 作者:数据小太阳 更新时间:2023-10-29 02:23:09 27 4
gpt4 key购买 nike

我想要一种快速获取 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 将响应主体写入传递给它的 类文件 对象。在这里,使用 writeclose 方法传入一个对象可以满足该要求,但会逐步将数据解析为 XML,而不是将其放在磁盘上。

另一种方法是在 HTTPPageGetter 级别 Hook 。 HTTPPageGettergetPage 内部使用的协议(protocol)。

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。由于这还不是任何版本的一部分,它不像前两种方法那样直接有用,但它更好一些,所以我将它包括在内,让您了解 future 会带来什么。 :) 新的 API 允许您指定一个协议(protocol)来接收响应主体。所以你会做这样的事情:

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

关于python - 如何获取 XML 文档并使用 Python twisted 对其进行解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1659380/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com