2010-11-24 69 views
1

J'ai vue index web d'un dossier ...L'écriture d'un Python RegEx pour sélectionner un sous-ensemble d'éléments de liste en HTML

<ul><li><a href="/sustainabilitymedia/pics/s5/"> Parent Directory</a></li> 
<li><a href="n150850_.jpg"> n150850_.jpg</a></li> 
<li><a href="n150850_ss.jpg"> n150850_ss.jpg</a></li> 
<li><a href="n150850q.jpg"> n150850q.jpg</a></li> 
<li><a href="n150858_.jpg"> n150858_.jpg</a></li> 
<li><a href="n150858_ss.jpg"> n150858_ss.jpg</a></li> 
<li><a href="n150858q.jpg"> n150858q.jpg</a></li> 
<li><a href="n150906_.jpg"> n150906_.jpg</a></li> 
<li><a href="n150906_ss.jpg"> n150906_ss.jpg</a></li> 
... 

La liste est longue et ainsi de suite. Mon but est de saisir uniquement les éléments de la liste se terminant par _ss.jpg afin que je puisse rendre mes résultats et les afficher correctement sur une page pour la présentation.

Je peux saisir la page avec BeautifulSoup mais à partir de là, je ne sais pas comment filtrer uniquement les éléments de la liste correspondant à un motif particulier. La page est derrière Basic Auth que j'ai résolu dans une question précédente concernant BeautifulSoup. Je suis heureux de ne pas l'utiliser non plus.

Des idées?

+0

Je suppose qu'une autre façon d'aborder ce problème est en quelque sorte de saisir le nom de fichier avec OUT la différence, puis d'appliquer chaque différence pour générer des listes de chaque type (?) ... – Flowpoke

Répondre

6

Vous pouvez faire un findAll() en utilisant une regex, par exemple soup_object.findAll('a', {'href': re.compile('.*_ss\.jpg')}).

+0

Wow. C'était rapide, merci, Brent! – Flowpoke

+0

Im essayant d'écrire un modèle pour les autres fichiers ... J'ai remarqué que certains se terminent par une lettre mais je souhaite exclure '_ss' dans l'ensemble résultant. Pourriez-vous m'aider à comprendre ce modèle? 'soup.findAll ('a', {'href': re.compile ('. * [az] \. jpg')})' Est-ce que je suis venu avec mais il inclut le _ss, je suppose que je dois trouver un moyen d '"exclure" tous les fichiers avec '_' dedans? – Flowpoke

+0

Vous pouvez le faire avec un lookbehind négatif: soup_object.findAll ('a', {'href': re.compile ('. * (?

1

Brent a exactement raison; +1 à lui d'être si rapide.

j'avais déjà travaillé sur un exemple, donc je pensais que je venais de poster de toute façon (pas besoin de voter à ce sujet):

>>> from BeautifulSoup import BeautifulSoup as bs 
>>> from pprint import pprint 
>>> import re 
>>> markup = ''' 
... <ul><li><a href="/sustainabilitymedia/pics/s5/"> Parent Directory</a></li> 
... <li><a href="n150850_.jpg"> n150850_.jpg</a></li> 
... <li><a href="n150850_ss.jpg"> n150850_ss.jpg</a></li> 
... <li><a href="n150850q.jpg"> n150850q.jpg</a></li> 
... <li><a href="n150858_.jpg"> n150858_.jpg</a></li> 
... <li><a href="n150858_ss.jpg"> n150858_ss.jpg</a></li> 
... <li><a href="n150858q.jpg"> n150858q.jpg</a></li> 
... <li><a href="n150906_.jpg"> n150906_.jpg</a></li> 
... <li><a href="n150906_ss.jpg"> n150906_ss.jpg</a></li>''' 
>>> soup = bs(markup) 
>>> pprint(soup.findAll(href=re.compile('_ss[.]jpg$'))) 
[<a href="n150850_ss.jpg"> n150850_ss.jpg</a>, 
<a href="n150858_ss.jpg"> n150858_ss.jpg</a>, 
<a href="n150906_ss.jpg"> n150906_ss.jpg</a>] 

Happy Thanksgiving à ceux qui la célèbrent.

+0

Merci pour l'exemple supplémentaire Adam. Je vais probablement utiliser cela aussi lors de la construction de mon point de vue. Je ferais mieux d'aller répondre à quelques questions aujourd'hui pour le payer en avant. – Flowpoke

0

je voudrais utiliser quelque chose comme

data = data.split("\n") 
data = filter(x : x.find("_ss.jpg") >= 0,data) 
data = map(lambda x: re.match("(?<=<href=)\".*_ss\.jpg\"(?=>)",x),data) 

ce qui devrait produire une liste des noms se terminant par _ss.jpg.