4

を使用して、YouTube ビデオ フィードから取得した XML 文字列を解析しようとしていますPython 3.3.1。コードは次のとおりです。

import re
import sys
import urllib.request
import urllib.parse
import xml.etree.ElementTree as element_tree

def get_video_id(video_url):
    return re.search(r'watch\?v=.*', video_url).group(0)[8:]

def get_video_feed(video_url):
    video_feed = "http://gdata.youtube.com/feeds/api/videos/" + get_video_id(video_url)
    return urllib.request.urlopen(video_feed).read()

def get_media_info(video_url):
    content = get_video_feed(video_url)
    content = str(content, 'ascii')
    media = {}
    e = element_tree.XML(content);

    print ( "CONTENT: \n" + content )

    print ( "\n\nELEMENTS : \n")
    for i in list(e):
        print (i) 

    media['title'] = e.findall('title')   //NOTE THIS!
    return media


def main():
    video_url = 'http://youtube.com/watch?v=q5sOLzEerwA' 

    print ( get_media_info(video_url) )

if __name__ == '__main__':
    main()

forループのget_media_info()要素が次のように印刷される理由がわかりません

<Element '{http://www.w3.org/2005/Atom}title' at 0x0000000002BF7D18>

これの代わりに:

<Element 'title' at 0x0000000002BF7D18>

率直に言って、私はそれが何を印刷するかは気にしません。私が気にしているのは、戻り値として要素のリストを渡し、期待することだけです'title'。ただし、xmlfindall()に名前を持つ要素が 1 つある場合でも、空のリストが返されます。title

だから私はこれを試しました:

media['title'] = e.findall('{http://www.w3.org/2005/Atom}title')

そして、1 つの要素のリストを返しました。私はこれがそれを行う方法ではないと確信しており、何かが欠けていると感じています.

これを修正する方法は?


上記のコードの出力は次のとおりです。

コンテンツ:

<?xml version='1.0' encoding='UTF-8'?>
<entry xmlns='http://www.w3.org/2005/Atom' xmlns:media='http://search.yahoo.com/mrss/' xmlns:gd='http://schemas.google.com/g/2005' xmlns:yt='http://gdata.youtube.com/schemas/2007'>
  <id>http://gdata.youtube.com/feeds/api/videos/q5sOLzEerwA</id>
  <published>2011-12-01T18:18:36.000Z</published>
  <updated>2013-05-07T03:20:04.000Z</updated>
  <category scheme='http://schemas.google.com/g/2005#kind' term='http://gdata.youtube.com/schemas/2007#video'/>
  <category scheme='http://gdata.youtube.com/schemas/2007/categories.cat' term='Music' label='Music'/>
  <title type='text'>Kala Bazaar - Khoya Khoya Chand Khula Aasman - Mohd Rafi.flv</title>
  <content type='text'>tanhayi me akele me khoya khoya chand.........</content>
  <link rel='alternate' type='text/html' href='http://www.youtube.com/watch?v=q5sOLzEerwA&amp;feature=youtube_gdata'/>
  <link rel='http://gdata.youtube.com/schemas/2007#video.responses' type='application/atom+xml' href='http://gdata.youtube.com/feeds/api/videos/q5sOLzEerwA/responses'/>
  <link rel='http://gdata.youtube.com/schemas/2007#video.related' type='application/atom+xml' href='http://gdata.youtube.com/feeds/api/videos/q5sOLzEerwA/related'/>
  <link rel='http://gdata.youtube.com/schemas/2007#mobile' type='text/html' href='http://m.youtube.com/details?v=q5sOLzEerwA'/>
  <link rel='self' type='application/atom+xml' href='http://gdata.youtube.com/feeds/api/videos/q5sOLzEerwA'/>
  <author>
    <name>a1a2a3a4a786</name>
    <uri>http://gdata.youtube.com/feeds/api/users/a1a2a3a4a786</uri>
  </author>
  <gd:comments>
    <gd:feedLink rel='http://gdata.youtube.com/schemas/2007#comments' href='http://gdata.youtube.com/feeds/api/videos/q5sOLzEerwA/comments' countHint='6'/>
  </gd:comments>
  <media:group>
    <media:category label='Music' scheme='http://gdata.youtube.com/schemas/2007/categories.cat'>Music</media:category>
    <media:content url='http://www.youtube.com/v/q5sOLzEerwA?version=3&amp;f=videos&amp;app=youtube_gdata' type='application/x-shockwave-flash' medium='video' isDefault='true' expression='full' duration='293' yt:format='5'/>
    <media:content url='rtsp://v6.cache3.c.youtube.com/CiILENy73wIaGQkArx4xLw6bqxMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp' type='video/3gpp' medium='video' expression='full' duration='293' yt:format='1'/>
    <media:content url='rtsp://v6.cache3.c.youtube.com/CiILENy73wIaGQkArx4xLw6bqxMYESARFEgGUgZ2aWRlb3MM/0/0/0/video.3gp' type='video/3gpp' medium='video' expression='full' duration='293' yt:format='6'/>
    <media:description type='plain'>tanhayi me akele me khoya khoya chand.........</media:description>
    <media:keywords/>
    <media:player url='http://www.youtube.com/watch?v=q5sOLzEerwA&amp;feature=youtube_gdata_player'/>
    <media:thumbnail url='http://i.ytimg.com/vi/q5sOLzEerwA/0.jpg' height='360' width='480' time='00:02:26.500'/>
    <media:thumbnail url='http://i.ytimg.com/vi/q5sOLzEerwA/1.jpg' height='90' width='120' time='00:01:13.250'/>
    <media:thumbnail url='http://i.ytimg.com/vi/q5sOLzEerwA/2.jpg' height='90' width='120' time='00:02:26.500'/>
    <media:thumbnail url='http://i.ytimg.com/vi/q5sOLzEerwA/3.jpg' height='90' width='120' time='00:03:39.750'/>
    <media:title type='plain'>Kala Bazaar - Khoya Khoya Chand Khula Aasman - Mohd Rafi.flv</media:title>
    <yt:duration seconds='293'/>
  </media:group>
  <gd:rating average='4.733333' max='5' min='1' numRaters='30' rel='http://schemas.google.com/g/2005#overall'/>
  <yt:statistics favoriteCount='0' viewCount='8140'/>
</entry>

要素:

<Element '{http://www.w3.org/2005/Atom}id' at 0x0000000002BF79F8>
<Element '{http://www.w3.org/2005/Atom}published' at 0x0000000002BF7B88>
<Element '{http://www.w3.org/2005/Atom}updated' at 0x0000000002BF7A48>
<Element '{http://www.w3.org/2005/Atom}category' at 0x0000000002BF7C78>
<Element '{http://www.w3.org/2005/Atom}category' at 0x0000000002BF7CC8>
<Element '{http://www.w3.org/2005/Atom}title' at 0x0000000002BF7D18>
<Element '{http://www.w3.org/2005/Atom}content' at 0x0000000002BF7D68>
<Element '{http://www.w3.org/2005/Atom}link' at 0x0000000002BF7DB8>
<Element '{http://www.w3.org/2005/Atom}link' at 0x0000000002BF7E08>
<Element '{http://www.w3.org/2005/Atom}link' at 0x0000000002BF7E58>
<Element '{http://www.w3.org/2005/Atom}link' at 0x0000000002BF7EA8>
<Element '{http://www.w3.org/2005/Atom}link' at 0x0000000002BF7EF8>
<Element '{http://www.w3.org/2005/Atom}author' at 0x0000000002BF7F48>
<Element '{http://schemas.google.com/g/2005}comments' at 0x0000000002C0B0E8>
<Element '{http://search.yahoo.com/mrss/}group' at 0x0000000002C0B1D8>
<Element '{http://schemas.google.com/g/2005}rating' at 0x0000000002C0B778>
<Element '{http://gdata.youtube.com/schemas/2007}statistics' at 0x0000000002C0B7C8>
{'title': []}
4

2 に答える 2

12

XML ドキュメントの名前空間は重要です。ElementTree では、適切な要素を見つけるためにタグを完全に修飾する必要があります。異なる名前空間に同じタグを持つ 3 つの要素の例を次に示します。

data = '''\
<root xmlns="xyz" xmlns:name="abc">
  <object name="one" />
  <name:object name="two" />
  <object xmlns="def" name="three" />
</root>
'''

ElementTree が参照する要素は次のとおりです。

>>> from xml.etree import ElementTree as et
>>> tree = et.fromstring(data)
>>> print(tree.findall('.//*'))
>>> et.dump(tree)
[<Element '{xyz}object' at 0x0000000003B07BD8>,
 <Element '{abc}object' at 0x0000000003B07C28>,
 <Element '{def}object' at 0x0000000003B07C78>]

だから、あなたはそれを正しく持っています。次のデフォルトの名前空間定義があるとします。

<entry xmlns='http://www.w3.org/2005/Atom' ...

デフォルトの名前空間を使用する「title」タグにアクセスするには:

media['title'] = e.findall('{http://www.w3.org/2005/Atom}title')

「media:group」タグにアクセスするには、メディア名前空間の定義を参照してください。

<entry ... xmlns:media='http://search.yahoo.com/mrss/' ...

そして使用:

e.findall('{http://search.yahoo.com/mrss/}group')

名前空間を指定するさまざまな方法に注意してください。

<root xmlns="xyz" xmlns:name="abc">   # default namespace and
                                      # 'abc' namespace with id 'name'.
  <object name="one" />               # Uses default namespace 'xyz'.
  <name:object name="two" />          # uses 'abc' namespace (specified by id).
  <object xmlns="def" name="three" /> # change the default namespace to 'def'.
</root>

特定の名前空間から特定のタグを読み取るには:

>>> print(tree.find('{abc}object').attrib['name'])
'two'

名前空間 ID は単なるショートカットであることに注意してください。解析された XML ツリーをダンプすると、次のようになります。ElementTree は、元の名前空間 ID をわざわざ保存せず、次の形式で独自に生成しますns#

>>> et.dump(tree)
<ns0:root xmlns:ns0="xyz" xmlns:ns1="abc" xmlns:ns2="def">
  <ns0:object name="one" />
  <ns1:object name="two" />
  <ns2:object name="three" />
</ns0:root>

特定のショートカットを定義したい場合は、「register_namespace」を使用してください:

>>> et.register_namespace('','xyz') # default namespace
>>> et.register_namespace('name','abc')
>>> et.register_namespace('custom','def')
>>> et.dump(tree)
<root xmlns="xyz" xmlns:custom="def" xmlns:name="abc">
  <object name="one" />
  <name:object name="two" />
  <custom:object name="three" />
</root>
于 2013-05-08T05:03:02.117 に答える
3

実際、私は を使用して次の方法を試しましxml.dom.minidomた。

#!/usr/bin/python

from xml.dom.minidom import parseString
import re
import urllib

def get_video_id(video_url):
    return re.search(r'watch\?v=.*', video_url).group(0)[8:]

def get_video_feed(video_url):
    video_feed = "http://gdata.youtube.com/feeds/api/videos/" + get_video_id(video_url)
    print video_feed
    return urllib.urlopen(video_feed).read()

def get_media_info(video_url):
    content = get_video_feed(video_url)
    dom = parseString(content)
    media = {}

    media['title'] = dom.getElementsByTagName('title')[0].firstChild.nodeValue
    return media

def main():
    video_url = 'http://youtube.com/watch?v=q5sOLzEerwA' 

    print ( get_media_info(video_url) )

if __name__ == '__main__':
    main()
于 2013-05-07T15:10:44.770 に答える