2010-08-15 12 views
0

Une page Web a un code de produit que je dois retrive, et il est dans la section HTML suivant:Aide récupérer le code produit de HTML en utilisant Beautiful Soup

<table...> 
<tr> 
<td> 
<font size="2">Product Code#</font> 
<br> 
<font size="1">2342343</font> 
</td> 

</tr> 
</table> 

Je crois que la meilleure façon de le faire serait commencez par référencer l'élément html avec la valeur de texte 'Product Code #', puis faites référence à la deuxième étiquette de police dans le TD.

Des idées?

+2

Je suis surpris de voir combien de personnes n'ont pas lu la partie de la question « BeautifulSoup ». – icktoofay

Répondre

1

Ma stratégie est la suivante:

  • Recherchez les nœuds de texte correspondant à la chaîne "Code de produit"
  • Pour chaque nœud de ce type, obtenez l'élément parent <font> et recherchez le parent suivantélément
  • Insérer le contenu de l'élément de frères et soeurs dans une liste

Le code:

from BeautifulSoup import BeautifulSoup 


html = open("products.html").read() 
soup = BeautifulSoup(html) 

product_codes = [tag.parent.findNextSiblings('font')[0].contents[0] 
       for tag in 
       soup.findAll(text='Product Code#')] 
0

Vous pouvez utiliser cette regex (ou quelque chose de similaire):

<td>\n\ <font\ size="2">Product\ Code\#</font>\n\ <br>\n\ <font\ size="1">(?<ProductCode>.+?)</font>\n\ </td>

Vous pouvez probablement supprimer certaines des échappées en fonction de votre moteur RegExp ... j'étais prudent.

1

En supposant soup est votre BeautifulSoup exemple:

int(''.join(soup("font", size="1")[0](text=True))) 

Ou, si vous avez besoin d'obtenir plusieurs codes de produit:

[int(''.join(font(text=True))) for font in soup("font", size="1")] 
+0

Echoue s'il y a d'autres colonnes 'size = "1"'. – PaulMcG

+0

@Paul: Vrai, mais il n'y en a pas, et il pourrait être restreint à la table dans laquelle il est si nécessaire. – icktoofay

0

Ne pas utiliser des expressions régulières pour analyser HTML. J'utiliser la XPATH suivante pour cette tâche:

//TABLE/TR/TD/FONT[@size='1'] 

Ou, si l'attribut de taille de la police n'est pas garanti d'être là et égal à 1:

//FONT[text()='Product Code#']/parent::*/FONT[2]