Je souhaite récupérer les données d'un site Web en utilisant Beautiful Soup et des requêtes, et j'ai presque ce que je veux, mais je ne trouve pas de moyen de filtrer les étapes finales:
Voici mon code:
<div class="gui-select"> <div class="product-configure"> <select id="custom-variants"> <option selected="selected" disabled="disabled">Select an option</option> <option data-value="177379037" data-status="available">Size : EU 40.5 (US 7)</option> <option data-value="177379043" data-status="available">Size : EU 41.5 (US 8)</option> <option data-value="177379223" data-status="available">Size : EU 42.5 (US 9)</option> </div>
Ceci imprime ce qui suit:
<div class="product-configure"> <select id="custom-variants"> <option disabled="disabled" selected="selected">Maak een keuze</option> <option data-status="available" data-value="177379037">Size : EU 40.5 (US 7) </option> <option data-status="available" data-value="177379043">Size : EU 41.5 (US 8) </option> <option data-status="available" data-value="177379223">Size : EU 42.5 (US 9) </option> </select> </div>
Comment puis-je filtrer ceci pour qu'il n'imprime que tous les nombres dans "data -valeur"? (par exemple "177379037" comme sortie pour la première ligne)
Voici le HTML:
variants = soup.find('div', class_='product-configure') print(variants)
3 Réponses :
Vous pouvez utiliser soup.find_all () et utiliser un dict avec les attributs
177379037 177379043 177379223
Résultat:
for o in options: print(o.attrs["data-value"])
options = soup.find_all("option", {"data-value": True})
exactement ce que je cherchais merci. Avez-vous également une idée de la façon dont je pourrais filtrer uniquement le texte brut qui commence par "Taille:"? Puisqu'il ne s'agit pas d'un attribut
J'utilise XPATH pour cela, je dois utiliser avant l'objet BeautifulSoup, vérifiez un exemple. Je vous laisse l'exemple xpath pour votre question: xpath_optiopns: "// options [@ data-value and contains (text (), 'Size:')]"
Vous utilisez find_all
pour obtenir toutes les balises , puis imprimez l'attribut
data-value
. Notez cependant que toutes les balises option
n'ont pas cet attribut, donc j'ai mis un try
là-dedans pour continuer s'il n'y a pas de data-value
trouvé.
177379037 177379043 177379223
html = ''' <div class="gui-select"> <div class="product-configure"> <select id="custom-variants"> <option selected="selected" disabled="disabled">Select an option</option> <option data-value="177379037" data-status="available">Size : EU 40.5 (US 7)</option> <option data-value="177379043" data-status="available">Size : EU 41.5 (US 8)</option> <option data-value="177379223" data-status="available">Size : EU 42.5 (US 9)</option> </div>''' import bs4 soup = bs4.BeautifulSoup(html, 'html.parser') elem = soup.find_all('option') for each in elem: try: print (each['data-value']) except: continue
Vous pouvez utiliser la classe avec l'attribut css selector
items = [item['data-value'] for item in soup.select('#custom-variants [data-value]')]
S'il n'y a qu'une seule classe à considérer, vous pouvez utiliser l'id pour la sélection
items = [item['data-value'] for item in soup.select('.product-configure [data-value]')]
Copie possible de Comment trouver l'attribut de données spécifique à partir de la balise html dans BeautifulSoup4?