web-dev-qa-db-fra.com

Extraire 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 de str

même si dans la documentation de Beautifulsoup, je comprends que les chaînes ne devraient pas être un problème ici ... mais je n’ai pas de spécialiste et j’ai peut-être mal compris.

Toute suggestion est grandement appréciée! Merci d'avance.

80
Barnabe

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

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

inputTag est une liste (contenant probablement un seul élément). En fonction de ce que vous voulez, vous devez faire exactement ce que vous voulez:

 output = inputTag[0]['value']

ou utilisez la méthode .find() qui retourne un seul (premier) élément trouvé:

 inputTag = soup.find(attrs={"name": "stainfo"})
 output = inputTag['value']
111
Łukasz

Dans Python 3.x, Utilisez simplement get(attr_name) sur votre objet de balise obtenu avec 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)

contre le 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>

impressions:

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

Si vous voulez récupérer plusieurs valeurs d'attributs à partir de la source ci-dessus, vous pouvez utiliser findAll et une liste de compréhension 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.
5
Margath

vous pouvez aussi utiliser ceci:

import requests
from bs4 import BeautifulSoup
import csv

url = "http://58.68.130.147/"
r = requests.get(url)
data = r.text

soup = BeautifulSoup(data, "html.parser")
get_details = soup.find_all("input", attrs={"name":"stainfo"})

for val in get_details:
    get_val = val["value"]
    print(get_val)
1
Mr.Bones

En fait, je vous suggérerais une façon de gagner du temps en supposant que vous sachiez quel type de balises possède ces attributs.

supposons qu'un tag xyz ait cet attritube nommé "staininfo" ..

full_tag = soup.findAll("xyz")

Et je ne veux pas que vous compreniez 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 toutes les balises xyz

1
b1tchacked