BeautifulSoup webscraping find_all( ): trouver la correspondance exacte
Je suis en utilisant Python et BeautifulSoup pour le web scraping.
Permet de dire que j'ai le code html suivant à gratter:
<body>
<div class="product">Product 1</div>
<div class="product">Product 2</div>
<div class="product special">Product 3</div>
<div class="product special">Product 4</div>
</body>
À l'aide de BeautifulSoup, je veux trouver UNIQUEMENT les produits avec l'attribut class="produit"
(seulement les Produits 1 et 2), et non pas "spécial" produits
Si je ne les suivants:
result = soup.find_all('div', {'class': 'product'})
le résultat comprend TOUS les produits (1,2,3 et 4).
Que dois-je faire pour trouver des produits dont la classe correspond EXACTEMENT à celle de "produit"??
Le Code que j'ai couru:
from bs4 import BeautifulSoup
import re
text = """
<body>
<div class="product">Product 1</div>
<div class="product">Product 2</div>
<div class="product special">Product 3</div>
<div class="product special">Product 4</div>
</body>"""
soup = BeautifulSoup(text)
result = soup.findAll(attrs={'class': re.compile(r"^product$")})
print result
De sortie:
[<div class="product">Product 1</div>, <div class="product">Product 2</div>, <div class="product special">Product 3</div>, <div class="product special">Product 4</div>]
OriginalL'auteur user2436815 | 2014-03-29
Vous devez vous connecter pour publier un commentaire.
Dans BeautifulSoup 4, le
class
attribut (et plusieurs autres attributs, tels queaccesskey
et laheaders
attribut sur la cellule du tableau des éléments) est traitée comme un ensemble; vous correspondent aux différents éléments énumérés dans l'attribut. Cela suit le standard HTML.En tant que tel, vous ne pouvez pas limiter la recherche à une seule classe.
Vous aurez à utiliser un fonction personnalisée ici pour le match contre la classe à la place:
J'ai utilisé un
lambda
pour créer une fonction anonyme; chaque balise est assorti nom (doit être'div'
), et la classe de l'attribut doit être exactement égale à la liste['product']
; par exemple, ont simplement celui de la valeur.Démo:
Par souci d'exhaustivité, voici tous ces attributs, à partir de la BeautifulSoup code source:
soup.find_all('div', {'class': ['class1','class2']})
mais il était égalementdiv
s qui n'avaientclass2
. Avec la il est en train de faire ce que je m'attends. Aucune idée de pourquoi celui que j'utilise ne sont pas de travail...OriginalL'auteur Martijn Pieters
Vous pouvez utiliser les sélecteurs CSS, comme ceci:
css-sélecteurs
Oups, mal lu votre question. Une autre solution serait de supprimer les divs de correspondance ".produit.spéciale", alors vous pouvez en toute sécurité de la recherche pour ".produit" sans rencontrer les autres.
OriginalL'auteur crunch