Ich versuche, die XML-Datei von YouTube zu analysieren, die in den folgenden Code eingebettet ist. Ich versuche, alle Titel anzuzeigen. Ich habe jedoch Probleme, wenn ich versuche, den 'Titel' zu drucken. Es werden nur Eingabezeilen angezeigt. Irgendein Rat?

#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
sharataka 8 Okt. 2012 im 18:24

3 Antworten

Beste Antwort

Titel ist kein Attribut, sondern ein untergeordnetes Element eines Eintrags.

Hier ist ein Beispiel, wie man es extrahiert:

for node in entry:
    video_title = node.getElementsByTagName('title')[0].firstChild.nodeValue
    print video_title
1
asciimoo 8 Okt. 2012 im 16:47

Lxml kann etwas schwierig herauszufinden sein, daher hier eine wirklich einfache, schöne Suppenlösung (sie wird aus einem bestimmten Grund als schöne Suppe bezeichnet). Sie können auch eine schöne Suppe für die Verwendung des lxml-Parsers einrichten, sodass die Geschwindigkeit ungefähr gleich ist.

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

Gibt eine Liste von title Elementen zurück. In diesem Fall können Sie auch soup.findAll('media:title') verwenden, um nur die media:title Elemente (die tatsächlichen Videonamen) zurückzugeben.

0
kreativitea 8 Okt. 2012 im 16:52

Es gibt einen kleinen Fehler in Ihrem Code. Sie greifen als Attribut auf title zu, obwohl es sich um ein untergeordnetes Element von entry handelt. Ihr Code kann repariert werden durch:

dom = parseString(data)
for node in dom.getElementsByTagName('entry'):
    print node.getElementsByTagName('title')[0].firstChild.data
0
Skovhus 8 Okt. 2012 im 17:05