2010-08-26 5 views
2

Je suis nouveau à Python et je suis en train de chercher dans html avec des expressions régulières qui ont été analysées avec BeautifulSoup. Je n'ai eu aucun succès et je pense que la raison en est que je ne comprends pas complètement comment configurer correctement les expressions régulières. J'ai regardé des questions plus anciennes sur des problèmes similaires mais je ne l'ai toujours pas compris. Si quelqu'un pouvait extraire le "/ torrent/32726/0 /" et "Slackware Linux 13.0 [x86 DVD ISO]" ainsi qu'une expression détaillée du fonctionnement de l'expression régulière, ce serait vraiment utile.Analysée Extraction HTML avec Python

<td class="name"> 
    <a href="/torrent/32726/0/"> 
    Slackware Linux 13.0 [x86 DVD ISO] 
    </a> 
</td> 

Edit: Ce que je voulais dire est, je suis en train d'extraire "/ torrent/32726/0 /" et "Slackware Linux 13.0 [x86 DVD ISO]" à l'aide BeautifulSoups fonctions pour rechercher l'arbre d'analyse syntaxique. J'ai essayé plusieurs choses après avoir cherché et lu la documentation, mais je ne suis toujours pas sûr de la façon de procéder. BeautifulSoup pourrait également extraire des valeurs de nœuds à partir de votre code HTML

+0

Maintenant, ils utilisent parseurs et veulent encore use regexes oO Que voulez-vous, extraire le contenu des ancres avec un href commençant par '/ torrent /'? Vous devez marcher l'arbre d'analyse. Vous pouvez utiliser les expressions rationnelles pour savoir si le nœud actuel est ce que vous voulez, mais vous devez parcourir l'arbre construit par l'analyseur. – delnan

+0

Je suppose que j'utilisais la mauvaise terminologie. Vous avez raison, je veux prendre cet arbre d'analyse que génère BeautifulSoup, et je veux extraire "/ torrent/32726/0 /" et "Slackware Linux 13.0 [x86 DVD ISO]" et les stocker dans leur propre dictionnaire. – FlowofSoul

Répondre

3

from BeautifulSoup import BeautifulSoup 

html = ('<html><head><title>Page title</title></head>' 
     '<body>' 
     '<table><tr>' 
     '<td class="name"><a href="/torrent/32726/0/">Slackware Linux 13.0 [x86 DVD ISO]</a></td>' 
     '<td class="name"><a href="/torrent/32727/0/">Slackware Linux 14.0 [x86 DVD ISO]</a></td>' 
     '<td class="name"><a href="/torrent/32728/0/">Slackware Linux 15.0 [x86 DVD ISO]</a></td>' 
     '</tr></table>' 
     'body' 
     '</html>') 
soup = BeautifulSoup(html) 
links = [td.find('a') for td in soup.findAll('td', { "class" : "name" })] 
for link in links: 
    print link.string 

Sortie:

Slackware Linux 13.0 [x86 DVD ISO] 
Slackware Linux 14.0 [x86 DVD ISO] 
Slackware Linux 15.0 [x86 DVD ISO] 
+0

Hé tu n'as jamais utilisé le re module. ¬¬ – razpeitia

2

Vous pouvez utiliser lxml.html pour analyser le document html:

from lxml import html 

doc = html.parse('http://example.com') 

for a in doc.cssselect('td a'): 
    print a.get('href') 
    print a.text_content() 

Vous devrez examiner la façon dont le document est structuré de manière à trouver le meilleur façon de déterminer les liens que vous voulez (il pourrait y avoir d'autres tables avec des liens dont vous n'avez pas besoin etc ...): vous pourriez d'abord vouloir pour trouver le bon élément table par exemple. Il y a aussi des options à côté des sélecteurs css (xpath par exemple) pour rechercher le document/l'élément.

Si vous avez besoin, vous pouvez transformer les liens en liens absolus avec .make_links_absolute() méthode (faire sur le document après l'analyse syntaxique, et toutes les URL sera absolue, très pratique)