2012-10-08 3 views
1

J'essaye d'analyser le xml de YouTube qui est incorporé dans le code ci-dessous. J'essaie d'afficher tous les titres. Cependant, je rencontre des problèmes lorsque j'essaie d'imprimer le «titre», seules les lignes apparaissent. Aucun conseil?Comment analyser YouTube XML en utilisant Python?

#import library to do http requests: 
import urllib2 

#import easy to use xml parser called minidom: 
from xml.dom.minidom import parseString 
#all these imports are standard on most modern python implementations 

#download the file: 
file = urllib2.urlopen('http://gdata.youtube.com/feeds/api/users/buzzfeed/uploads?v=2&max-results=50') 
#convert to string: 
data = file.read() 
#close file because we dont need it anymore: 
file.close() 

#parse the xml you downloaded 
dom = parseString(data) 
entry=dom.getElementsByTagName('entry') 
for node in entry: 
    video_title=node.getAttribute('title') 
    print video_title 
+1

Veuillez ajouter un extrait du XML que vous voulez analyser. –

+1

Veuillez ne pas utiliser 'minidom'. La documentation vous dit d'utiliser l'API ['ElementTree'] (http://docs.python.org/library/xml.etree.elementtree.html) à la place. Vous pouvez utiliser la version incluse dans la bibliothèque standard ou utiliser l'excellente bibliothèque ['lxml' external] (http://lxml.de/) qui se développe sur cette API. –

+0

http://lxml.de/ – sean

Répondre

1

Le titre n'est pas un attribut, il s'agit d'un élément enfant d'une entrée.

ici est un exemple pour l'extraire:

for node in entry: 
    video_title = node.getElementsByTagName('title')[0].firstChild.nodeValue 
    print video_title 
0

lxml peut être un peu difficile à comprendre, voici donc un vraiment simple, belle solution de soupe (Il est appelé beautifulsoup pour une raison). Vous pouvez également configurer une belle soupe pour utiliser l'analyseur lxml, donc la vitesse est à peu près la même.

from bs4 import BeautifulSoup 
soup = BeautifulSoup(data) # data as is seen in your code 
soup.findAll('title') 

renvoie une liste d'éléments title. vous pouvez également utiliser soup.findAll('media:title') dans ce cas pour renvoyer uniquement les éléments media:title (les noms de vidéo réels).

0

Il un petit bug dans votre code. Vous accédez à titre titre comme un attribut, bien que ce soit un élément enfant de entrée. Votre code peut être corrigé par:

dom = parseString(data) 
for node in dom.getElementsByTagName('entry'): 
    print node.getElementsByTagName('title')[0].firstChild.data 
Questions connexes