1

xmlファイルからのよう<title>なタグ値を読み取りたい。正常に読み取られた<title_id>値。同じループで、<title>を読み取ることは可能ですか? XMLを初めて使用するのを手伝ってください。<title><title_id>

        <mediawiki xmlns="http://www.mediawiki.org/xml/export-0.5/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.5/ http://www.mediawiki.org/xml/export-0.5.xsd" version="0.5" xml:lang="en">
      <siteinfo>
        <sitename>Wiki</sitename>
        <case>first-letter</case>
        <namespaces>
          <namespace key="0" case="first-letter" />
        </namespaces>
      </siteinfo>
      <page>
        <title>Sex</title>
        <title_id>31239628</title_id>
        <revision>
          <id>437708703</id>
          <timestamp>2011-07-04T13:53:52Z</timestamp>
          <text xml:space="preserve" bytes="6830">{{ Hello}}

    </text>
        </revision>
      </page>
    </mediawiki>

次のコードを使用して、ファイルからすべてのタイトルを読み取ります。そして、それはうまく機能しています。

import xml.etree.cElementTree as etree
tree = etree.parse('find_title.xml')
for value in tree.getiterator(tag='title'):
    print value.text
4

1 に答える 1

1

XML を頻繁に使用する場合は、 XPATHに慣れておくことをお勧めします。

これは、私の好みの XML ライブラリを使用した簡単なスニペットlxmlです。

from lxml import etree

doc = etree.XML("""
<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.5/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.5/ http://www.mediawiki.org/xml/export-0.5.xsd" version="0.5" xml:lang="en">
  <siteinfo>
    <sitename>Wiki</sitename>
    <case>first-letter</case>
    <namespaces>
      <namespace key="0" case="first-letter" />
    </namespaces>
  </siteinfo>
  <page>
    <title>Sex</title>
    <title_id>31239628</title_id>
    <revision>
      <id>437708703</id>
      <timestamp>2011-07-04T13:53:52Z</timestamp>
      <text xml:space="preserve" bytes="6830">{{ Hello}}
      </text>
    </revision>
  </page>
</mediawiki>
""")

def first(seq,default=None):
  for item in seq:
    return item
  return default

NSMAP=dict(mw="http://www.mediawiki.org/xml/export-0.5/")

print first(doc.xpath('/mw:mediawiki/mw:page/mw:title/text()',namespaces=NSMAP))
print first(doc.xpath('/mw:mediawiki/mw:page/mw:title_id/text()',namespaces=NSMAP))

収量:

セックス
31239628

更新-複数のページ要素を想定

XPATH クエリは、ほとんどの場合、ノード シーケンスを返します (したがって、first関数です)。

すべてのページの両方のタグの値を返す 1 つのクエリを使用できます。次に、サブ要素がページにない場合、それらをグループ化する必要があります。サブ要素が存在することを確認するクエリを作成できますが、部分的なレコードなどがあることを知りたい場合があります。

したがって、これに対する私の最初の答えは、次のようにページをループすることです。

for i,page in enumerate(doc.xpath('/mw:mediawiki/mw:page',namespaces=NSMAP)):
  title = first(page.xpath('./mw:title/text()',namespaces=NSMAP))
  title_id = first(page.xpath('./mw:title_id/text()',namespaces=NSMAP))
  print "Page %s: %s (%s)"  % (i,title,title_id)

収量:

ページ 0: セックス (31239628)
于 2011-10-19T10:20:46.817 に答える