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

4voto

En combinant les réponses de Chris Redford et d'Amr, vous pouvez également rechercher un nom d'attribut avec n'importe quelle valeur à l'aide de la commande select :

from bs4 import BeautifulSoup as Soup
html = '<td valign="top">.....</td>\
    <td width="580" valign="top">.......</td>\
    <td>.....</td>'
soup = Soup(html, 'lxml')
results = soup.select('td[valign]')

4voto

Michael Points 1

Si vous cherchez à extraire toutes les balises où un attribut particulier est présent à tous vous pouvez utiliser le même code que la réponse acceptée, mais au lieu de spécifier une valeur pour la balise, mettez simplement True.

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

Cette méthode renvoie toutes les balises td dotées d'attributs valign. C'est utile si votre projet consiste à extraire des informations d'une balise comme div qui est utilisée partout, mais qui peut gérer des attributs très spécifiques que vous pourriez rechercher.

3voto

Shah Vipul Points 156

Trouver en utilisant un attribut dans n'importe quelle balise

<th class="team" data-sort="team">Team</th>    
soup.find_all(attrs={"class": "team"}) 

<th data-sort="team">Team</th>  
soup.find_all(attrs={"data-sort": "team"})

0voto

Si vous voulez imprimer le nom de toutes les balises dans différentes lignes qui ont un attribut spécifique, par exemple imprimer toutes les balises avec id quelle que soit la valeur :

from bs4 import BeautifulSoup ;
from bs4 import element ;
html = '!DOCTYPE html><html><head><title>Navigate Parse Tree</title></head>\
<body><h1>This is your Assignment</h1><a href = "https://www.google.com">This is a link that will take you to Google</a>\
<ul><li><p> This question is given to test your knowledge of <b>Web Scraping</b></p>\
<p>Web scraping is a term used to describe the use of a program or algorithm to extract and process large amounts of data from the web.</p></li>\
<li id = "li2">This is an li tag given to you for scraping</li>\
<li>This li tag gives you the various ways to get data from a website\
<ol><li class = "list_or">Using API of the website</li><li>Scrape data using BeautifulSoup</li><li>Scrape data using Selenium</li>\
<li>Scrape data using Scrapy</li></ol></li>\
<li class = "list_or"><a href="https://www.crummy.com/software/BeautifulSoup/bs4/doc/">\
Clicking on this takes you to the documentation of BeautifulSoup</a>\
<a href="https://selenium-python.readthedocs.io/" id="anchor">Clicking on this takes you to the documentation of Selenium</a>\
</li></ul></body></html>'

data = BeautifulSoup(html, 'html.parser');
for i in data.descendants :
     if type(i) == element.Tag:
        if i.attrs != {} and 'id' in i.attrs:
           print(i.name)

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