2
votes

Beau filtrage de soupe pour les mots-clés / attributs (python)

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 :


2
votes

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})


2 commentaires

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:')]"



0
votes

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


0 commentaires

2
votes

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]')]


0 commentaires