So finden Sie bestimmte Elemente in XML mit Hilfe von ElementTree
Ich versuche zu analysieren, XML-Zeichenfolge, die ich von youtube-video-feeds, mit Python 3.3.1
. Hier ist der code:
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()
Ich habe keine Ahnung, warum das for
Schleife in get_media_info()
druckt Elemente wie
<Element '{http://www.w3.org/2005/Atom}title' at 0x0000000002BF7D18>
statt:
<Element 'title' at 0x0000000002BF7D18>
Ehrlich gesagt, ist mir egal, was er druckt. Aller I-Sorgfalt ist, möchte ich weitergeben 'title'
zu findall()
und erwarten eine Liste von element(s) zurückgegeben Wert. Aber es gibt leere Liste, obwohl es ein element mit dem Namen title
in der xml.
Also versuchte ich Folgendes:
media['title'] = e.findall('{http://www.w3.org/2005/Atom}title')
Und es kehrte zurück, eine Liste mit einem element. Ich bin sicher, dies ist nicht der Weg, es zu tun, und ich glaube, ich bin etwas fehlt.
Wie man dieses Problem beheben?
Dies ist die Ausgabe des obigen Codes:
INHALT:
<?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&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&f=videos&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&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>
ELEMENTE :
<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': []}
InformationsquelleAutor Nawaz | 2013-05-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den namespace eines XML-Dokuments ist von Bedeutung. ElementTree erfordert tags vollständig qualifiziert sein, finden Sie die richtige element. Hier ist ein Beispiel der drei Elemente mit dem gleichen tag in unterschiedlichen namespaces:
Hier die Elemente, die ElementTree sieht:
So haben Sie die richtige. Angesichts der default-namespace-definition:
Zugriff auf das 'title' - tag, das verwendet ist der Standard-namespace:
Zugriff auf die "media:group" - Tags finden Sie auf der media-namespace-definition:
Und Verwendung:
Beachten Sie die verschiedenen Möglichkeiten, wie ein namespace angegeben werden kann:
Lesen einem bestimmten tag aus einem bestimmten namespace:
Hinweis: der namespace-IDs sind nur Verknüpfungen. Hier ist, was passiert, wenn Sie werfen den geparsten XML Baum. ElementTree nicht stören, Sie zu speichern Sie die original-namespace-IDs und generiert seine eigene im format
ns#
:Wenn Sie möchten, dass bestimmte Verknüpfungen definiert haben, verwenden Sie `register_namespace':
element_tree.register_namespace('', 'http://www.w3.org/2005/Atom')
und dannmedia['title'] = e.findall('title')
. Es noch gibt leere Liste. Können wir machen, damit es funktioniert irgendwie, ohnenamespace
zufindall()
?Nein,
register_namespace
ist nur für die Ausgabe. Wenn SieElementTree
, müssen Sie den vollständig qualifizierten Namen. Schreiben Sie einfach eine Hilfsfunktion zu Heften Sie es auf. Könnte man auf den Drittenlxml
. Es hat eine ElementTree-ähnliche Schnittstelle und kann haben die Fähigkeit, die Sie wollen. Ich bin nicht so vertraut mit es.InformationsquelleAutor Mark Tolonen
Eigentlich habe ich versucht die folgende Weise mit
xml.dom.minidom
, Nur für den Fall, es hilft dir trotzdem.InformationsquelleAutor gsmaker