2016-09-29 21 views
0

次のXMLがあります。PythonでネストされたタグのXMLを解析する方法

私はpythonでこのXMLを解析しようと含まれています URL arrayを作成してい
<component name="QUESTIONS"> 
    <topic name="Chair"> 
     <state>active</state> 
     <subtopic name="Wooden"> 
      <links> 
       <link videoDuration="" youtubeId="" type="article"> 
        <label>Understanding Wooden Chair</label> 
        <url>http://abcd.xyz.com/1111?view=app</url> 
       </link> 
       <link videoDuration="" youtubeId="" type="article"> 
        <label>How To Assemble Wooden CHair</label> 
        <url>http://abcd.xyz.com/2222?view=app</url> 
       </link> 
       <link videoDuration="11:35" youtubeId="Qasefrt09_2" type="video"> 
        <label>Wooden Chair Tutorial</label> 
        <url>/</url> 
       </link> 
       <link videoDuration="1:06" youtubeId="MSDVN235879" type="video"> 
        <label>How To Access Wood</label> 
        <url>/</url> 
       </link> 
      </links> 
     </subtopic> 
    </topic> 
    <topic name="Table"> 
     <state>active</state> 
     <subtopic name=""> 
      <links> 
       <link videoDuration="" youtubeId="" type="article"> 
        <label>Understanding Tables</label> 
        <url>http://abcd.xyz.com/3333?view=app</url> 
       </link> 
       <link videoDuration="" youtubeId="" type="article"> 
        <label>Set-up Table</label> 
        <url>http://abcd.xyz.com/4444?view=app</url> 
       </link> 
       <link videoDuration="" youtubeId="" type="article"> 
        <label>How To Change table</label> 
        <url>http://abcd.xyz.com/5555?view=app</url> 
       </link> 
      </links> 
     </subtopic> 
    </topic> 
</component> 

: 1.リンク]タブのXML 2に存在するすべてのHTTP URLのユーチューブが存在する場合、そのをキャプチャし、 youtubeのURLを準備してURL arrayに追加してください。

私は次のコードを持っていますが、私にURLとリンクを与えていません。

from xml.etree import ElementTree 

with open('faq.xml', 'rt') as f: 
    tree = ElementTree.parse(f) 

for node in tree.iter(): 
    print node.tag, node.attrib.get('url') 

for node in tree.iter('outline'): 
    name = node.attrib.get('link') 
    url = node.attrib.get('url') 
    if name and url: 
     print ' %s :: %s' % (name, url) 
    else: 
     print name 

すべてのURLを取得するにはどうすればよいですか?

は、以下の回答に基づいて次のコードを作成しました。 次の問題は、すべてではなく1つのURLだけを印刷していることです。

from xml.etree import ElementTree 

def fetch_faq_urls(): 
    url_list = [] 
    with open('faq.xml', 'rt') as f: 
     tree = ElementTree.parse(f) 

    for link in tree.iter('link'): 
     youtube = link.get('youtubeId') 
     if youtube: 
      print "https://www.youtube.com/watch?v=" + youtube 
      video_url = "https://www.youtube.com/watch?v=" + youtube 
      url_list.append(video_url) 
      # print "youtubeId", link.find('label').text, '???' 
     else: 
      print link.find('url').text 
      article_url = link.find('url').text 
      url_list.append(article_url) 
      # print 'url', link.find('label').text, 
     return url_list 

faqs = fetch_faq_urls() 
print faqs 

答えて

1

あなたが欲しい情報が<link>の下にあるので、ちょうどそれらを反復処理。 get()を使用してyoutubeのIDを取得し、find()を取得して子の<url>オブジェクトを取得します。

from xml.etree import ElementTree 

with open('faq.xml', 'rt') as f: 
    tree = ElementTree.parse(f) 

for link in tree.iter('link'): 
    youtube = link.get('youtubeId') 
    if youtube: 
     print "youtube", link.find('label').text, '???' 
    else: 
     print 'url', link.find('label').text, link.find('url').text 
+0

ありがとうございます。私は何をする必要があるかという考えを得ました。ありがとうtdelaney –

+0

私の質問を開発コードで更新しましたか?私はなぜ配列に1つの値を押しているのか分からないのですか? –

+1

@in_learning_software - ちょっとしたインデント問題です。 'return url_list'は' for'ブロックにあるので、ループの最初のパスで実行されることに注意してください。単に次の高いレベルに専念する。 – tdelaney

0

xmltodictをご覧ください。

>>> print(json.dumps(xmltodict.parse(""" 
... <mydocument has="an attribute"> 
... <and> 
...  <many>elements</many> 
...  <many>more elements</many> 
... </and> 
... <plus a="complex"> 
...  element as well 
... </plus> 
... </mydocument> 
... """), indent=4)) 
{ 
    "mydocument": { 
     "@has": "an attribute", 
     "and": { 
      "many": [ 
       "elements", 
       "more elements" 
      ] 
     }, 
     "plus": { 
      "@a": "complex", 
      "#text": "element as well" 
     } 
    } 
} 
関連する問題