
Bernabé
Estoy tratando de extraer el contenido de un solo atributo de “valor” en una etiqueta de “entrada” específica en una página web. Yo uso el siguiente código:
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)
Obtengo un TypeError: los índices de la lista deben ser números enteros, no str
a pesar de que de la documentación de Beautifulsoup entiendo que las cadenas no deberían ser un problema aquí… pero no soy un especialista y es posible que lo haya entendido mal.
¡Cualquier sugerencia sera grandemente apreciada!

Łukasz
.find_all()
devuelve una lista de todos los elementos encontrados, por lo que:
input_tag = soup.find_all(attrs={"name" : "stainfo"})
input_tag
es una lista (que probablemente contiene un solo elemento). Dependiendo de lo que quieras exactamente, debes hacer:
output = input_tag[0]['value']
o usar .find()
método que devuelve solo un (primer) elemento encontrado:
input_tag = soup.find(attrs={"name": "stainfo"})
output = input_tag['value']
En Python 3.x
simplemente usa get(attr_name)
en su objeto de etiqueta que obtiene usando 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)
contra archivo XML conf//test1.xml
eso parece como:
<?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>
huellas dactilares:
Processing repElem...
Attribute id = 11
Attribute name = Joe
Processing repElem...
Attribute id = 12
Attribute name = Mary

vijayraj34
Para mi:
<input id="color" value="Blue"/>
Esto se puede obtener mediante el siguiente fragmento.
page = requests.get("https://www.abcd.com")
soup = BeautifulSoup(page.content, 'html.parser')
colorName = soup.find(id='color')
print(colorName['value'])

Margath
Si desea recuperar múltiples valores de atributos de la fuente anterior, puede usar findAll
y una lista de comprensión para obtener todo lo que necesita:
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.

b1tchacked
De hecho, le sugeriría una forma de ahorrar tiempo con esto, suponiendo que sepa qué tipo de etiquetas tienen esos atributos.
supongamos que una etiqueta xyz tiene ese atributo llamado “staininfo”.
full_tag = soup.findAll("xyz")
Y quiero que entiendas que full_tag es una lista
for each_tag in full_tag:
staininfo_attrb_value = each_tag["staininfo"]
print staininfo_attrb_value
Por lo tanto, puede obtener todos los valores attrb detaininfo para todas las etiquetas xyz

Mr.Bones
también puedes usar esto:
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)

PedroXX
Estoy usando esto con Beautifulsoup 4.8.1 para obtener el valor de todos los atributos de clase de ciertos elementos:
from bs4 import BeautifulSoup
html = "<td class="val1"/><td col="1"/><td class="val2" />"
bsoup = BeautifulSoup(html, 'html.parser')
for td in bsoup.find_all('td'):
if td.has_attr('class'):
print(td['class'][0])
Es importante tener en cuenta que la clave de atributo recupera una lista incluso cuando el atributo tiene un solo valor.