211 votes

Extraction d'une valeur d'attribut avec beautifulsoup

J'essaie d'extraire le contenu d'un seul attribut "value" dans une balise "input" spécifique sur une page web. J'utilise le code suivant :

import urllib
f = urllib.urlopen("http://58.68.130.147")
s = f.read()
f.close()

from BeautifulSoup import BeautifulStoneSoup
soup = BeautifulStoneSoup(s)

inputTag = soup.findAll(attrs={"name" : "stainfo"})

output = inputTag['value']

print str(output)

J'obtiens un TypeError : les index de liste doivent être des entiers, pas

des chaînes

même si, d'après la documentation de Beautifulsoup, je comprends que les cordes ne devraient pas être un problème ici... mais je ne suis pas un spécialiste et j'ai peut-être mal compris.

Toute suggestion est grandement appréciée !

262voto

Łukasz Points 5614

.find_all() renvoie la liste de tous les éléments trouvés, donc :

input_tag = soup.find_all(attrs={"name" : "stainfo"})

input_tag est une liste (ne contenant probablement qu'un seul élément). Selon ce que vous voulez exactement, vous devez faire :

output = input_tag[0]['value']

ou utilisez la méthode .find() qui ne renvoie qu'un (premier) élément trouvé :

input_tag = soup.find(attrs={"name": "stainfo"})
output = input_tag['value']

49voto

amphibient Points 4704

Dans Python 3.x, il suffit d'utiliser get(attr_name) sur votre objet tag que vous obtenez en utilisant find_all :

xmlData = None

with open('conf//test1.xml', 'r') as xmlFile:
    xmlData = xmlFile.read()

xmlDecoded = xmlData

xmlSoup = BeautifulSoup(xmlData, 'html.parser')

repElemList = xmlSoup.find_all('repeatingelement')

for repElem in repElemList:
    print("Processing repElem...")
    repElemID = repElem.get('id')
    repElemName = repElem.get('name')

    print("Attribute id = %s" % repElemID)
    print("Attribute name = %s" % repElemName)

par rapport au fichier XML conf//test1.xml qui ressemble à :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <singleElement>
        <subElementX>XYZ</subElementX>
    </singleElement>
    <repeatingElement id="11" name="Joe"/>
    <repeatingElement id="12" name="Mary"/>
</root>

tirages :

Processing repElem...
Attribute id = 11
Attribute name = Joe
Processing repElem...
Attribute id = 12
Attribute name = Mary

23voto

vijayraj34 Points 385

Pour moi :

<input id="color" value="Blue"/>

Ceci peut être récupéré par l'extrait ci-dessous.

page = requests.get("https://www.abcd.com")
soup = BeautifulSoup(page.content, 'html.parser')
colorName = soup.find(id='color')
print(colorName['value'])

8voto

Margath Points 21

Si vous souhaitez récupérer plusieurs valeurs d'attributs à partir de la source ci-dessus, vous pouvez utiliser findAll et une compréhension de liste pour obtenir tout ce dont vous avez besoin :

import urllib
f = urllib.urlopen("http://58.68.130.147")
s = f.read()
f.close()

from BeautifulSoup import BeautifulStoneSoup
soup = BeautifulStoneSoup(s)

inputTags = soup.findAll(attrs={"name" : "stainfo"})
### You may be able to do findAll("input", attrs={"name" : "stainfo"})

output = [x["stainfo"] for x in inputTags]

print output
### This will print a list of the values.

6voto

slim Points 13

Je vous suggérerais en fait un moyen de gagner du temps pour aller avec cela en supposant que vous savez quel genre de balises ont ces attributs.

Supposons qu'un tag xyz ait cet attritube nommé "Taininfo".

full_tag = soup.findAll("xyz")

Et je ne veuxpas que tu comprennes que full_tag est une liste

for each_tag in full_tag:
    staininfo_attrb_value = each_tag["staininfo"]
    print staininfo_attrb_value

Ainsi, vous pouvez obtenir toutes les valeurs attrb de staininfo pour tous les tags xyz

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