2010-09-16 6 views
0

J'ai un tableau HTML dont j'essaye d'analyser l'information. Cependant, certaines des tables couvrent plusieurs lignes/colonnes, ce que je voudrais faire est d'utiliser quelque chose comme BeautifulSoup pour analyser la table dans un type de structure Python. Je penser d'utiliser simplement une liste de listes, donc je tournerais quelque chose commeBeautifulSoup ou regex Table HTML à la structure de données?

<tr> 
    <td>1,1</td> 
    <td>1,2</td> 
</tr> 
<tr> 
    <td>2,1</td> 
    <td>2,2</td> 
</tr> 

dans

[['1,1', '1,2'], 
['2,1', '2,2']] 

Ce que je (crois) devrait être assez simple. Cependant, il y a quelques légères complications, car certaines des cellules couvrent plusieurs rangées/cols. De plus, il y a beaucoup d'informations complètement inutiles:

<td ondblclick="DoAdd('/student_center/sc_all_rooms/d05/09/2010/editformnew?display=W&amp;style=L&amp;positioning=A&amp;adddirect=yes&amp;accessid=CreateNewEdit&amp;filterblock=N&amp;popeditform=yes&amp;returncalendar=student_center/sc_all_rooms')" 
    class="listdefaultmonthbg" 
    style="cursor:crosshair;" 
    width="5%" 
    nowrap="1" 
    rowspan="1"> 
     <a class="listdatelink" 
      href="/student_center/sc_all_rooms/d05/09/2010/edit?style=L&amp;display=W&amp;positioning=A&amp;filterblock=N&amp;adddirect=yes&amp;accessid=CreateNewEdit">Sep 5</a> 
    </td> 

Et ce que le code ressemble vraiment est encore pire. Tout ce que je vraiment besoin de sortir de là est:

<td rowspan="1">Sep 5</td> 

Deux lignes plus tard, il y a un rowspan de 17. Pour plusieurs rangées portées je pensais quelque chose comme ceci:

<tr> 
    <td rowspan="2">Sep 5</td> 
    <td>Some event</td> 
</tr> 
<tr> 
    <td>Some other event</td> 
</tr> 

mettrait fin comme ceci:

[["Sep 5", "Some event"], 
[None, "Some other event"]] 

Il y a plusieurs tables sur la page, et je peux trouver celui que je veux déjà, je ne suis pas sûr de savoir comment analyser les informations dont j'ai besoin. Je sais que je peux utiliser BeautfulSoup pour "RenderContents", mais dans certains cas il y a des balises de lien dont je dois me débarrasser (tout en gardant le texte).

Je pensais à un processus quelque chose comme ceci:

  1. Rechercher une table
  2. Count lignes dans les tableaux
  3. Créer une liste
  4. table Parse dans la liste (syntaxe BeautifulSoup ?? (len(table.findAll('tr'))?) ?)
  5. ???
  6. Profit! (Eh bien, c'est un programme purement interne, donc pas vraiment ...)

Répondre

0

Vous aurez probablement besoin d'identifier la table avec une attrs, ID ou le nom.

from BeautifulSoup import BeautifulSoup 

data = """ 
<table> 
<tr> 
    <td>1,1</td> 
    <td>1,2</td> 
</tr> 
<tr> 
    <td>2,1</td> 
    <td>2,2</td> 
</tr> 
</table> 
""" 

soup = BeautifulSoup(data) 

for t in soup.findAll('table'): 
    for tr in t.findAll('tr'): 
     print [td.contents for td in tr.findAll('td')] 

Modifier: Que devrait faire le programme s'il y a plusieurs liens?

Ex:

<td><a href="#">A</a> B <a href="#">C</a></td> 
Questions connexes