2010-03-06 14 views
3

tout en utilisant beautifulsoup pour analyser une table en html tous les rangs commence parComment puis-je empêcher une belle soupe de sauter des rangs pendant l'analyse?

<tr class="row_k"> 

au lieu d'une balise tr sans classe

Exemple HTML

<tr class="row_k"> 
<td><img src="some picture url" alt="Item A"></td> 
<td><a href="some url"> Item A</a></td> 
<td>14.8k</td> 
<td><span class="drop">-555</span></td> 
<td> 
<img src="some picture url" alt="stuff" title="stuff"> 
</td> 
<td> 
<img src="some picture url" alt="Max llll"> 
</td> 
</tr> 
<tr> 
<td><img src="some picture url" alt="Item B"></td> 
<td><a href="some url"> Item B</a></td> 
<td>64.9k</td> 
<td><span class="rise">+165</span></td> 
<td> 
<img src="some picture url" alt="stuff" title="stuff"> 
</td> 
<td> 
<img src="some picture url" alt="max llll"> 
</td> 
</tr> 
<tr class="row_k"> 
<td><img src="some picture url" alt="Item C"></td> 
<td><a href="some url"> Item C</a></td> 
<td>4,000</td> 
<td><span class="rise">+666</span></td> 
<td> 
<img src="some picture url" title="stuff"> 
</td> 
<td> 
<img src="some picture url" alt="Maximum lllle"> 

Le texte que je souhaite extraire est 14.8k, 64.9k et 4.000J'ai l'impression que ce code est mal écrit. Existe-t-il un outil plus flexible que je puisse utiliser tel qu'un analyseur XML? que quelqu'un pourrait suggérer.

toujours ouvert à toutes les réponses qui utilisent encore beautifulsoup.

+0

Ce serait plus facile si vous aviez inclus plus de html. Je pense que vous dites qu'il y a une balise d'ancrage dans le corps d'une table et la colonne suivante dans la table après l'ancre a les données que vous voulez. – PyNEwbie

+0

J'ai fait un échantillon. J'utilise beautifulsoup pour faire cela mais le problème est que toutes les autres colonnes de la table ont tr class = "row_k" donc il l'ignore et ne me donnera pas l'information des balises tr. Je vais mettre à jour ma question. – Pevo

Répondre

2

J'apprends encore beaucoup mais je vais vous suggérer d'essayer lxml. Je vais essayer de le faire et je pense que ça vous mènera surtout là-bas, mais il y a peut-être des subtilités dont je ne suis pas certain.

supposant cela1 est une chaîne

from lxml.html import fromstring 
this1_tree=fromstring(this1) 
all_cells=[(item[0], item[1]) for item in enumerate(this1_tree.cssselect('td'))] # I am hoping this gives you the cells with their relative position in the document) 

La seule chose que je ne suis pas tout à fait certain est de savoir si vous tester la clé ou la valeur ou text_content pour chaque cellule pour savoir si elle a la chaîne que vous cherchez dans la référence ou le texte d'ancrage. C'est pourquoi je voulais un échantillon de votre code HTML. Mais l'un des ceux-ci devraient travailler

the_cell_before_numbers=[] 
for cell in all_cells: 
    if 'Item' in cell[1].text_content(): 
     the_cell_before_numbers.append(cell[0]) 

Maintenant que vous avez la cellule avant peut alors obtenir la valeur dont vous avez besoin en obtenant le contenu du texte de la prochaine cellule

todays_price=all_cells[the_cell_before_number+1][1].text_content() 

Je suis sûr qu'il ya un façon plus jolie mais je pense que cela vous y mènera. J'ai testé en utilisant votre code HTML et j'ai eu ce que vous recherchiez.

+0

J'ai mis à jour avec un échantillon du html – Pevo

+0

désolé, je suis tout nouveau à cela. Je ne suis pas sûr de savoir comment mettre en œuvre cela? =/où dois-je mettre tout cela? – Pevo

+0

Eh bien, j'utilise lxml au lieu de BeautifulSoup. Vous devez donc installer lxml. Vous devez revenir à une version antérieure de cette question car ma réponse a été construite en utilisant cette description. Mais ce code devrait vous y mener. Il suppose que this1 est la page htm que vous avez utilisée en utilisant urllib et c'est un objet string. – PyNEwbie