1

スクリプトを機能させようとしています。これまでのところ、何も出力できませんでした。

これは私の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 の場合に解析することです。

4

1 に答える 1

6

名前空間付きのドキュメントを解析していますが、名前空間のないタグにのみ適用されるため、タグは存在'page'ません。

'{http://www.mediawiki.org/xml/export-0.8/}page'代わりに、要素を含む要素を探してい'{http://www.mediawiki.org/xml/export-0.8/}ns'ます。

多くのlxmlメソッドでは、名前空間マップを指定してマッチングを容易にすることができますがiterparse()、残念ながらメソッドはそれらの 1 つではありません。

次の呼び出しは、正しいタグ.iterparse()を確実に処理します。page

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

ただし、を使用してページ要素のタグとタグ.find()を取得するか、呼び出しを使用してテキストを直接取得する必要があります。nstitlexpath()

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
于 2013-05-15T13:25:00.157 に答える