2011-12-22 8 views
2

J'essaie de gratter un peu de contenu (je suis très nouveau à Python) et je suis tombé sur une pierre d'achoppement. Le code que je suis en train de gratter est:Python BeautifulSoup analyse

<h2><a href="/best-sellers/sj-b9822.html">Spear & Jackson Predator Universal Hardpoint Saw  - 22"</a></h2> 
<p><span class="productlist_mostwanted_rrp">  
Was: <span class="strikethrough">£12.52</span></span><span class="productlist_mostwanted_save">Save: £6.57(52%)</span></p> 

<div class="clear"></div> 

<p class="productlist_mostwanted_price">Now: £5.95</p> 

Ce que je suis en train de gratter est le texte du lien (Lance & Jackson, etc) et le prix (5,95 £). Je l'ai regardé au sujet sur Google, la documentation BeautifulSoup et sur ce forum et j'ai réussi à extraire le « maintenant: £ 5.95 » en utilisant ce code:

for node in soup.findAll('p', { "class" : "productlist_grid_price" }): 
    print ''.join(node.findAll(text=True)) 

Cependant le résultat que je suis après est juste 5,95. J'ai aussi eu un succès limité en essayant d'obtenir le texte du lien (Lance & Jackson) en utilisant:

soup.h2.a.contents[0] 

Cependant, bien sûr ce que revient le premier résultat.

Le résultat final que je visais est d'avoir les résultats ressemblent:

Spear & Jackson Predator Universal Hardpoint Saw - 22 5.95 
etc 
etc 

Comme je cherche à exporter à un csv, je dois savoir comment mettre les données en 2 colonnes. Comme je dis je suis très nouveau à python alors j'espère que cela a du sens.

J'apprécie toute aide!

Un grand merci

Répondre

1

Je pense que ce que vous cherchez quelque chose comme ceci:

from BeautifulSoup import BeautifulSoup 
import re 

soup = BeautifulSoup(open('prueba.html').read()) 
item = re.sub('\s+', ' ', soup.h2.a.text) 
price = soup.find('p', {'class': 'productlist_mostwanted_price'}).text 
price = re.search('\d+\.\d+', price).group(0) 

print item, price 

Exemple de sortie:

Lance & Jackson Predator Universal Saw hardpoint - 22" 5,95

Remarque Pour l'élément, l'expression régulière est utilisée uniquement pour supprimer les espaces supplémentaires, tandis que pour le prix est utilisé pour capturer le nombre.

+0

Merci! Cela saisit le premier. Pourriez-vous m'informer de la façon dont je pourrais construire une boucle pour retourner tous les résultats, puisque ce code renvoie juste le premier, mais parfaitement. –

+0

Cela dépend de leur emplacement dans le DOM (s'ils sont dans la même page). – jcollado

+0

Oui, ils sont dans la même page. J'ai essayé de créer une boucle mais mes efforts ne méritent que le mépris. Encore assez nouveau pour la programmation en général! –

0
html = ''' 
<h2><a href="/best-sellers/sj-b9822.html">Spear & Jackson Predator Universal Hardpoint Saw  - 22</a></h2> 
<p><span class="productlist_mostwanted_rrp">  
Was: <span class="strikethrough">&pound;12.52</span></span><span class="productlist_mostwanted_save">Save: &pound;6.57(52%)</span></p> 
<div class="clear"></div> 
<p class="productlist_mostwanted_price">Now: &pound;5.95</p> 
''' 

from BeautifulSoup import BeautifulSoup 
import re 

soup = BeautifulSoup(html) 
desc = soup.h2.a.getText() 
price_str = soup.find('p', {"class": "productlist_mostwanted_price" }).getText() 
price = float(re.search(r'[0-9.]+', price_str).group()) 

print desc, price 
+0

Merci, cependant, il met le prix incorrect (dit 5.0) et ne traverse pas. Merci bien –

+0

@PeterStannett Vraiment? L'exécution à travers Python2.7 donne '' Spear & Jackson Predator Universal Hardpoint Saw - 22 5.95''. Avez-vous eu un problème de copier-coller? –

+0

Le problème était complètement entièrement moi. Toutes mes excuses! Je l'ai repris comme copier et coller plutôt que de le taper dehors et c'était bien! Est-ce que le [0-9] signifie que si un produit était dit £ 16, il n'imprimerait pas? Aussi, j'ai du mal à obtenir le code pour en faire plus d'un. J'apprécie votre aide. –