2010-11-23 6 views
2

J'ai cherché haut et bas pour une explication décente du fonctionnement de BeautifulSoup ou de LXML. Certes, leur documentation est géniale, mais pour quelqu'un comme moi, python/programmeur novice, il est difficile de déchiffrer ce que je cherche.Python, BeautifulSoup ou LXML - Analyse d'URL d'image à partir de HTML en utilisant des balises CSS

De toute façon, en tant que mon premier projet, j'utilise Python pour analyser un flux RSS pour les liens de publication - je l'ai fait avec Feedparser. Mon plan est de gratter ensuite les images de chaque message. Pour la vie de moi cependant, je n'arrive pas à comprendre comment obtenir BeautifulSoup ou LXML pour faire ce que je veux! J'ai passé des heures à lire la documentation et à googler en vain, alors je suis là. Ce qui suit est une ligne de la grande image (mon scrapee).

<div class="bpBoth"><a name="photo2"></a><img src="http://inapcache.boston.com/universal/site_graphics/blogs/bigpicture/shanghaifire_11_22/s02_25947507.jpg" class="bpImage" style="height:1393px;width:990px" /><br/><div onclick="this.style.display='none'" class="noimghide" style="margin-top:-1393px;height:1393px;width:990px"></div><div class="bpCaption"><div class="photoNum"><a href="#photo2">2</a></div>In this photo released by China's Xinhua news agency, spectators watch an apartment building on fire in the downtown area of Shanghai on Monday Nov. 15, 2010. (AP Photo/Xinhua) <a href="#photo2">#</a><div class="cf"></div></div></div> 

Ainsi, selon ma compréhension de la documentation, je devrais pouvoir passer les éléments suivants:

soup.find("a", { "class" : "bpImage" }) 

Pour trouver tous les cas avec cette classe css. Eh bien, ça ne retourne rien. Je suis sûr que je néglige quelque chose de trivial alors j'apprécie énormément votre patience.

Merci beaucoup pour vos réponses!

Pour les futurs Googlers, je vais inclure mon code feedparser:

#! /usr/bin/python 

# RSS Feed Parser for the Big Picture Blog 

# Import applicable libraries 

import feedparser 

#Import Feed for Parsing 
d = feedparser.parse("http://feeds.boston.com/boston/bigpicture/index") 

# Print feed name 
print d['feed']['title'] 

# Determine number of posts and set range maximum 
posts = len(d['entries']) 

# Collect Post URLs 
pointer = 0 
while pointer < posts: 
    e = d.entries[pointer] 
    print e.link 
    pointer = pointer + 1 

Répondre

3

En utilisant lxml, vous pourriez faire quelque chose comme ceci:

import feedparser 
import lxml.html as lh 
import urllib2 

#Import Feed for Parsing 
d = feedparser.parse("http://feeds.boston.com/boston/bigpicture/index") 

# Print feed name 
print d['feed']['title'] 

# Determine number of posts and set range maximum 
posts = len(d['entries']) 

# Collect Post URLs 
for post in d['entries']: 
    link=post['link'] 
    print('Parsing {0}'.format(link)) 
    doc=lh.parse(urllib2.urlopen(link)) 
    imgs=doc.xpath('//img[@class="bpImage"]') 
    for img in imgs: 
     print(img.attrib['src']) 
+0

C'est parfait. Merci beaucoup. – tylerdavis

1

Le code que vous avez posté recherche tous a éléments avec la classe bpImage. Mais votre exemple a la classe bpImage sur l'élément img, pas le a. Vous avez juste besoin de faire:

soup.find("img", { "class" : "bpImage" }) 
+0

Haha. Bien sûr. Donc, cela renvoie l'URL avec des balises. Y at-il un moyen de dépouiller ceux-ci à l'URL? – tylerdavis

1

aide pyparsing pour rechercher des balises est assez intuitive:

from pyparsing import makeHTMLTags, withAttribute 

imgTag,notused = makeHTMLTags('img') 

# only retrieve <img> tags with class='bpImage' 
imgTag.setParseAction(withAttribute(**{'class':'bpImage'})) 

for img in imgTag.searchString(html): 
    print img.src 
Questions connexes