Question

Voici un extrait d'un fichier HTML j'explore avec soupe Belle.

<td width="50%">
    <strong class="sans"><a href="http:/website">Site</a></strong> <br /> 

Je voudrais obtenir le <a href> pour toute ligne qui a <strong class="sans"> et qui est à l'intérieur d'un <td width="50%">.

Est-il possible d'interroger un fichier HTML pour les multiples conditions d'utilisation Beautiful Soup?

Était-ce utile?

La solution

mécanismes de recherche de beautifulsoup acceptent un appelable, que les documents semblent recommander pour votre cas: « Si vous avez besoin d'imposer des restrictions complexes ou de verrouillage sur les attributs d'une balise, passer dans un objet appelable pour le nom, ... ». (Ok ... ils parlent des attributs spécifiquement, mais les conseils reflète un esprit sous-jacent à l'API BeautifulSoup).

Si vous voulez en une ligne:

soup.findAll(lambda tag: tag.name == 'a' and \
tag.findParent('strong', 'sans') and \
tag.findParent('strong', 'sans').findParent('td', attrs={'width':'50%'}))

Je l'ai utilisé un lambda dans cet exemple, mais en pratique, vous pouvez définir une fonction appelable si vous avez plusieurs exigences enchaînées que ce lambda doit faire deux appels findParent('strong', 'sans') pour éviter de soulever une exception si une balise <a> n'a pas parent strong. L'utilisation d'un bon fonctionnement, vous pouvez faire le test plus efficace.

Autres conseils

>>> BeautifulSoup.BeautifulSoup("""<html><td width="50%">
...     <strong class="sans"><a href="http:/website">Site</a></strong> <br />
... </html>""" )
<html><td width="50%">
<strong class="sans"><a href="http:/website">Site</a></strong> <br />
</td></html>
>>> [ a for a in strong.findAll("a") 
            for strong in tr.findAll("strong", attrs = {"class": "sans"}) 
                for tr in soup.findAll("td", width = "50%")]
[<a href="http:/website">Site</a>]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top