Extrayendo un valor de atributo con beautifulsoup
Estoy intentando extraer el contenido de un único 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)
yo obtengoTypeError: list indices must be integers, not str
Aunque, según 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 haya entendido mal.
¡Cualquier sugerencia sera grandemente apreciada!
.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 (probablemente contiene solo un elemento). Dependiendo de lo que quieras exactamente, deberías hacer:
output = input_tag[0]['value']
o utilice .find()
un método que devuelva solo un (primer) elemento encontrado:
input_tag = soup.find(attrs={"name": "stainfo"})
output = input_tag['value']
En Python 3.x
, simplemente use 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 un archivo XML conf//test1.xml
que se parece a:
<?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
Para mí:
<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'])
Si desea recuperar múltiples valores de atributos de la fuente anterior, puede usar findAll
una lista por 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.