2008-10-27 9 views
4

Existe-t-il un moyen de lire une collection d'éléments d'extension avec Universal Feed Parser?Lire des collections d'éléments étendus dans un flux RSS avec Universal Feed Parser

Ceci est juste un court extrait de Kuler Flux RSS:

<channel> 
    <item> 
    <!-- snip: regular RSS elements --> 
    <kuler:themeItem> 
     <kuler:themeID>123456</kuler:themeID> 
     <!-- snip --> 
     <kuler:themeSwatches> 
     <kuler:swatch> 
      <kuler:swatchHexColor>FFFFFF</kuler:swatchHexColor> 
      <!-- snip --> 
     </kuler:swatch> 
     <kuler:swatch> 
      <kuler:swatchHexColor>000000</kuler:swatchHexColor> 
      <!-- snip --> 
     </kuler:swatch> 
     </kuler:themeSwatches> 
    </kuler:themeItem> 
    </item> 
</channel> 

J'ai essayé les éléments suivants:

>>> feed = feedparser.parse(url) 
>>> feed.channel.title 
u'kuler highest rated themes' 
>>> feed.entries[0].title 
u'Foobar' 
>>> feed.entries[0].kuler_themeid 
u'123456' 
>>> feed.entries[0].kuler_swatch 
u'' 

feed.entries[0].kuler_swatchhexcolor ne renvoie que la dernière kuler:swatchHexColor. Est-il possible de récupérer tous les éléments avec feedparser?

J'ai déjà travaillé sur le problème en utilisant minidom, mais je voudrais utiliser Universal Feed Parser si possible (en raison d'API très simple). Peut-il être prolongé? Je n'ai rien trouvé à ce sujet dans la documentation, donc si quelqu'un a plus d'expérience avec la bibliothèque, s'il vous plaît, conseillez-moi.

Répondre

3

Universal Feed Parser est vraiment agréable pour la plupart des flux, mais pour les flux étendus, vous pouvez essayer quelque chose appelé BeautifulSoup. C'est une bibliothèque d'analyse XML/HTML/XHTML qui est conçue à l'origine pour le screencraping; s'avère que c'est aussi génial pour ce genre de chose. La documentation est assez bonne, et elle a une API auto-explicative, donc si vous envisagez d'utiliser quoi que ce soit d'autre, c'est ce que je recommanderais.

je serais probablement l'utiliser comme ceci:

>>> import BeautifulSoup 
>>> import urllib2 

# Fetch HTML data from url 
>>> connection = urllib2.urlopen('http://kuler.adobe.com/path/to/rss.xml') 
>>> html_data = connection.read() 
>>> connection.close() 

# Create and search the soup 
>>> soup = BeautifulSoup.BeautifulSoup(html_data) 
>>> themes = soup.findAll('kuler:themeitem') # Note: all lower-case element names 

# Get the ID of the first theme 
>>> themes[0].find('kuler:themeid').contents[0] 
u'123456' 

# Get an ordered list of the hex colors for the first theme 
>>> themeswatches = themes[0].find('kuler:themeswatches') 
>>> colors = [color.contents[0] for color in 
... themeswatches.findAll('kuler:swatchhexcolor')] 
>>> colors 
[u'FFFFFF', u'000000'] 

vous pouvez donc probablement obtenir l'idée que c'est une bibliothèque très cool. Ce ne serait pas très bien si vous analysiez un ancien flux RSS, mais comme les données proviennent d'Adobe Kuler, vous pouvez être sûr que cela ne va pas assez varier pour casser votre application (c'est-à-dire une source suffisamment fiable).

Encore pire est d'essayer d'analyser le foutu format .ASE d'Adobe. J'ai essayé d'écrire un analyseur pour ça et c'est devenu vraiment horrible, très rapidement. Ug. Donc, oui, les flux RSS sont probablement le moyen le plus simple de s'interfacer avec Kuler.

+0

Merci, je vais vérifier cela aussi. L'API semble un peu plus facile qu'avec minidom: je choisirais find/findAll vs getElementsByTagName tous les jours :) –

+0

Basé sur cette réponse j'ai fait une petite API python pour kuler - pykuler: https://github.com/ fikovnik/pykuler Merci! – fikovnik