【问题标题】:Parsing a partial XML with python lxml使用 python lxml 解析部分 XML
【发布时间】:2014-12-19 18:12:30
【问题描述】:

我正在尝试用 Python 解析从网络接收到的大型 XML 文件。

为此,我获取数据并将其传递给lxml.etree.iterparse

但是,如果 XML 尚未完全发送,像这样:

<MyXML>
    <MyNode foo="bar">
    <MyNode foo="ba

如果我运行etree.iterparse(f, tag='MyNode').next(),我会在任何被切断的地方得到XMLSyntaxError

有什么办法可以让我接收到第一个标签(即第一个 MyNode),并且只有在我到达文档的那部分时才得到异常? (使 lxml 真正“流式传输”内容,而不是在一开始就阅读整个内容)。

【问题讨论】:

    标签: python xml lxml


    【解决方案1】:

    XMLPullParserHTMLPullParser 可能更适合您的需求。他们通过反复调用parser.feed(data) 来获取数据。您仍然必须等到所有数据都输入后才能使用树。

    【讨论】:

    • 这有问题,因为我收到的数据“可能”永远不会被完全接收。
    • 这是个问题。从 python 3.4 开始,lxml 有Incremental event parsing。当您的数据流死亡时,也许您可​​以跟踪元素堆栈并将关闭元素提供给解析器。如果你是中间元素,它就行不通了(&lt;alert warning="help I'm being attacked by a...)。
    • 我需要支持python 2.7,我也需要支持中间元素。
    【解决方案2】:

    尝试从与您的问题相关的两个问题的答案中学习。在更多相关答案中找到更多智慧。您的问题很常见,可能需要稍微调整一下以适应经过验证的解决方案。更喜欢这种方式来创建稳定的解决方案。

    【讨论】:

    • 不过,这些都没有解析部分 XML。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 2014-02-23
    相关资源
    最近更新 更多