125 votes

Comment trouver des balises avec seulement certains attributs - BeautifulSoup

Comment puis-je, en utilisant BeautifulSoup, rechercher des tags contenant UNIQUEMENT les attributs que je recherche ?

Par exemple, je veux trouver tous les <td valign="top"> étiquettes.

Le code suivant : raw_card_data = soup.fetch('td', {'valign':re.compile('top')})

récupère toutes les données que je souhaite, mais aussi toutes les <td> qui possède l'attribut valign:top

J'ai également essayé : raw_card_data = soup.findAll(re.compile('<td valign="top">')) et ceci ne renvoie rien (probablement à cause d'une mauvaise regex)

Je me demandais s'il y avait un moyen dans BeautifulSoup de dire "Rechercher <td> dont le seul attribut est valign:top "

MISE À JOUR Par exemple, si un document HTML contenait ce qui suit <td> étiquettes :

<td valign="top">.....</td><br />
<td width="580" valign="top">.......</td><br />
<td>.....</td><br />

Je ne voudrais que le premier <td> étiquette ( <td width="580" valign="top"> ) pour renvoyer

141voto

Loïc G. Points 2034

Comme expliqué sur le site Documentation de BeautifulSoup

Vous pouvez utiliser ce :

soup = BeautifulSoup(html)
results = soup.findAll("td", {"valign" : "top"})

EDIT :

Pour renvoyer les balises qui n'ont que l'attribut valign="top", vous pouvez vérifier la longueur de la balise attrs propriété :

from BeautifulSoup import BeautifulSoup

html = '<td valign="top">.....</td>\
        <td width="580" valign="top">.......</td>\
        <td>.....</td>'

soup = BeautifulSoup(html)
results = soup.findAll("td", {"valign" : "top"})

for result in results :
    if len(result.attrs) == 1 :
        print result

Cela renvoie :

<td valign="top">.....</td>

65voto

Yogesh Points 745

Vous pouvez utiliser lambda fonctions en findAll comme expliqué dans la documentation . Ainsi, dans votre cas, vous devez rechercher td avec seulement valign = "top" utiliser ce qui suit :

td_tag_list = soup.findAll(
                lambda tag:tag.name == "td" and
                len(tag.attrs) == 1 and
                tag["valign"] == "top")

56voto

Amr Points 332

Si vous souhaitez effectuer une recherche uniquement sur les noms d'attributs ayant une valeur quelconque

from bs4 import BeautifulSoup
import re

soup= BeautifulSoup(html.text,'lxml')
results = soup.findAll("td", {"valign" : re.compile(r".*")})

Selon Steve Lorimer, il est préférable de passer True au lieu de regex

results = soup.findAll("td", {"valign" : True})

20voto

Chris Redford Points 1417

Le moyen le plus simple d'y parvenir est d'utiliser le nouveau style CSS select méthode :

soup = BeautifulSoup(html)
results = soup.select('td[valign="top"]')

5voto

juliomalegria Points 6281

Il suffit de le passer comme argument de findAll :

>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup("""
... <html>
... <head><title>My Title!</title></head>
... <body><table>
... <tr><td>First!</td>
... <td valign="top">Second!</td></tr>
... </table></body><html>
... """)
>>>
>>> soup.findAll('td')
[<td>First!</td>, <td valign="top">Second!</td>]
>>>
>>> soup.findAll('td', valign='top')
[<td valign="top">Second!</td>]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X