【问题标题】:Parse large XML with lxml使用 lxml 解析大型 XML
【发布时间】:2013-05-10 01:56:22
【问题描述】:

我正在尝试让我的脚本正常工作。到目前为止,它还没有输出任何东西。

这是我的 test.xml

<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.8/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.8/ http://www.mediawiki.org/xml/export-0.8.xsd" version="0.8" xml:lang="it">
<page>
    <title>MediaWiki:Category</title>
    <ns>0</ns>
    <id>2</id>
    <revision>
      <id>11248</id>
      <timestamp>2003-12-31T13:47:54Z</timestamp>
      <contributor>
        <username>Frieda</username>
        <id>0</id>
      </contributor>
      <minor />
      <text xml:space="preserve">categoria</text>
      <sha1>0acykl71lto9v65yve23lmjgia1h6sz</sha1>
      <model>wikitext</model>
      <format>text/x-wiki</format>
    </revision>
  </page>
</mediawiki>

这是我的代码

from lxml import etree

def fast_iter(context, func):
    # fast_iter is useful if you need to free memory while iterating through a
    # very large XML file.
    #
    # http://www.ibm.com/developerworks/xml/library/x-hiperfparse/
    # Author: Liza Daly
    for event, elem in context:
        func(elem)
        elem.clear()
        while elem.getprevious() is not None:
            del elem.getparent()[0]
    del context

def process_element(elem):
    if elem.ns.text == '0':
        print elem.title.text

context=etree.iterparse('test.xml', events=('end',), tag='page')
fast_iter(context, process_element)

我没有收到任何错误,只是没有输出。我想要得到的是解析元素是否为0。

【问题讨论】:

    标签: python xml lxml


    【解决方案1】:

    您正在解析一个命名空间的文档,并且不存在'page' 标签,因为这仅适用于标签没有命名空间。

    您正在寻找包含'{http://www.mediawiki.org/xml/export-0.8/}ns' 元素的'{http://www.mediawiki.org/xml/export-0.8/}page' 元素。

    许多lxml 方法确实允许您指定命名空间映射以使匹配更容易,但不幸的是iterparse() 方法不是其中之一。

    以下.iterparse() 调用肯定会处理正确的page 标签:

    context = etree.iterparse('test.xml', events=('end',), tag='{http://www.mediawiki.org/xml/export-0.8/}page')
    

    但您需要使用.find() 来获取页面元素上的nstitle 标签,或者使用xpath() 调用来直接获取文本:

    def process_element(elem):
        if elem.xpath("./*[local-name()='ns']/text()=0"):
            print elem.xpath("./*[local-name()='title']/text()")[0]
    

    对于您的输入示例,打印:

    >>> fast_iter(context, process_element)
    MediaWiki:Category
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多