2016-03-31 14 views
2

なぜタイムスタンプに到達しようとしている間にエラーが発生するのかわかりません。 XML形式(一部の属性を除いたもの):要素ツリーxml

EDIT:xmlファイルの実際のタイプです。

<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.10/ http://www.mediawiki.org/xml/export-0.10.xsd" version="0.10" xml:lang="en"> 
    <siteinfo> 
     <sitename>Wikipedia</sitename> 
     <dbname>enwiki</dbname> 
     <base>https://en.wikipedia.org/wiki/Main_Page</base> 
     <generator>MediaWiki 1.27.0-wmf.18</generator> 
     <case>first-letter</case> 
     <namespaces>...</namespaces> 
    </siteinfo> 
    <page> 
     <title>Zhuangzi</title> 
     <ns>0</ns> 
     <id>42870472</id> 
     <revision> 
      <id>610251969</id> 
      <timestamp>2014-05-26T20:08:14Z</timestamp> 
      <contributor> 
       <username>White whirlwind</username> 
       <id>8761551</id> 
      </contributor> 
      <comment>...</comment> 
      <model>wikitext</model> 
      <format>text/x-wiki</format> 
      <text xml:space="preserve" bytes="41">#REDIRECT [[Zhuang Zhou]] {{R from move}}</text> 
      <sha1>9l31fcd4fp0cfxgearifr7jrs3240xl</sha1> 
     </revision> 
     <revision>...</revision> 
     <revision>...</revision> 
     <revision>...</revision> 
     <revision>...</revision> 
     <revision>...</revision> 

    </page> 
    <page>...</page> 
</mediawiki> 

しかし、私は次のことをしようとしている:

for page in root:   
    for revision in page: 
    print(revision.find('timestamp').text) 

私はあなたがすべてのタグに.findを使用するために起こっているので、明らかに各タグを反復処理しているエラーに

print(revision.find('timestamp').text) 
    AttributeError: 'NoneType' object has no attribute 'text' 
+0

をrevision.find( 'timestamp') 'というエラーメッセージが表示されますが、' revision'に 'revision'を探していたというメッセージが表示されます:' revision.find( 'revision') '。どちらが本当ですか? – CiaPan

+0

'timestamp 'は私が探しているものです – Knokkelgeddon

答えて

1

を取得何も返さないので、あなたのエラー:

In [9]: for page in root: 
      print(page.tag) 
      for revision in page: 
        print(revision.tag) 
    ...:   

id 
timestamp 
contributor 
comment 
model 

あなたはそれぞれのタグをチェックしなければならない独自のメソッドを使用して:

xml = fromstring(xml) 

for page in xml: 
    for revision in page: 
     if revision.tag == "timestamp": 
      print(revision.text) 

あなたはすべてのリビジョンタグを取得し、タイムスタンプを抽出するためのfindAll使用することができます。

In [1]: xml = """<page> 
    ...: <title>Zhuangzi</title> 
    ...: <ns>0</ns> 
    ...: <id>42870472</id> 
    ...: <revision> 
    ...:  <id>610251969</id> 
    ...:  <timestamp>2014-05-26T20:08:14Z</timestamp> 
    ...:  <contributor> 
    ...:   <username>White whirlwind</username> 
    ...:   <id>8761551</id> 
    ...:  </contributor> 
    ...:  <comment>TEXT</comment> 
    ...:  <model>wikitext</model> 
    ...: </revision> 
    ...: </page>""" 

In [2]: import xml.etree.ElementTree as ET 

In [3]: from StringIO import StringIO 

In [4]: tree = ET.parse(StringIO(xml)) 

In [5]: root = tree.getroot() 


In [6]: print([r.find("timestamp").text for r in root.findall("revision")]) 
['2014-05-26T20:08:14Z'] 

あなたがlxmlを使用した場合は、

012:名前空間マッピングを使用する必要がありますあなたが投稿したもので

from lxml.etree import parse,fromstring 

xml = """<page> 
    <title>Zhuangzi</title> 
    <ns>0</ns> 
    <id>42870472</id> 
    <revision> 
     <id>610251969</id> 
     <timestamp>2014-05-26T20:08:14Z</timestamp> 
     <contributor> 
     <username>White whirlwind</username> 
     <id>8761551</id> 
     </contributor> 
     <comment>TEXT</comment> 
     <model>wikitext</model> 
    </revision> 
</page>""" 


root = fromstring(xml) 

print(root.xpath("//revision/timestamp/text()")) 
['2014-05-26T20:08:14Z'] 

:シンプルなXPath式を使用することができます

tree = ET.parse("your_xml") 
root = tree.getroot() 
ns = {"wiki":"http://www.mediawiki.org/xml/export-0.10/"} 


ts = [ts.text for ts in root.findall(".//wiki:revision//wiki:timestamp", ns) ] 

すべてのリビジョンタグにはタイムスタンプタグが含まれていると仮定します。

かのXPathでlxmlの使用:あなたは

tree = parse("test.xml") 

for elem in tree.getiterator(): 
    print elem.tag 

を印刷する場合

from lxml.etree import parse 


tree = parse("your_fie") 
ns = {"wiki": "http://www.mediawiki.org/xml/export-0.10/"} 

print(tree.xpath("//wiki:revision//wiki:timestamp//text()",namespaces=ns)) 

出力は次のようになります。

{http://www.mediawiki.org/xml/export-0.10/}mediawiki 
{http://www.mediawiki.org/xml/export-0.10/}siteinfo 
{http://www.mediawiki.org/xml/export-0.10/}sitename 
{http://www.mediawiki.org/xml/export-0.10/}dbname 
{http://www.mediawiki.org/xml/export-0.10/}base 
{http://www.mediawiki.org/xml/export-0.10/}generator 
{http://www.mediawiki.org/xml/export-0.10/}case 
{http://www.mediawiki.org/xml/export-0.10/}namespaces 
{http://www.mediawiki.org/xml/export-0.10/}page 
............................. 

+0

XPathはlxmlで動作しますが、質問には" elementtree "というタグが付けられています。 – mzjn

+0

@mzjn、そう、タグを誤読しますが、ロジックとfindallの動作は全く同じです。 –

+0

'print([r.find(" timestamp ").rのテキストがroot.findall(" revision ")))" 'は何も印刷しません。' tree = ET.parse( '2articles.xml')としてインポートされた文書を持っています。 root = tree.getroot() ' – Knokkelgeddon

0

私は単にのようなものだろう:

import xml.etree.ElementTree as ET 
root = ET.parse('your_xml_file.xml') 
timestamp = root.find('.//timestamp').text 

あなたのXMLは、複数のタイムスタンプ要素を持っている場合は、私はとの最後の行に変更します:あなたは `「タイムスタンプ」の追求と言う

timestamps = [t.text for t in root.findall('.//timestamp')] 
関連する問題