2010-04-10 19 views
53

Estoy tratando de extraer el contenido de un solo atributo "valor" en una etiqueta específica "de entrada" en una página web. Yo uso el siguiente código:La extracción de un valor de atributo con BeautifulSoup

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) 

consigo un TypeError: Lista de los índices deben ser enteros, no str

a pesar de la documentación BeautifulSoup entiendo que las cadenas no deben ser un problema, pero aquí ... No soy especialista y puedo haber entendido mal.

¡Cualquier sugerencia es muy apreciada! Gracias de antemano.

Respuesta

81

.findAll() lista retornos de todos los elementos que se encuentran, por lo que:

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

inputTag es una lista (probablemente contiene sólo un elemento). Dependiendo de lo que desea es exactamente lo que tampoco debe hacer:

output = inputTag[0]['value'] 

o utilizar .find() método que devuelve sólo una (primera) encontrado elemento:

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

Buen material! Gracias. ahora tengo una pregunta sobre el análisis del resultado que es un largo grupo de caracteres no ASCII, pero lo haré en otra pregunta. – Barnabe

+1

no debería accederse al 'valor' según http://stackoverflow.com/questions/2616659/extracting-value-in-beautifulsoup. ¿Qué hace que el código anterior funcione en este caso? Pensé que tendrías que acceder al valor haciendo 'output = inputTag [0].contenidos' – Seth

+0

@Seth - no, porque está buscando input-tag's attrib 'value', y .contents devuelve el texto encapsulado por la etiqueta ( I am .contents) - (solo respondiendo ahora porque tuve que duplicar verifique lo que sucedía, imagine que alguien más puede beneficiarse) –

1

que en realidad le sugeriría un ahorro de tiempo camino a seguir con esto asumiendo que sabes qué tipo de etiquetas tienen esos atributos.

supongamos decir un xyz etiqueta tiene que attritube llamado "staininfo" ..

full_tag = soup.findAll("xyz") 

Y Me wa que entiendan que full_tag es una lista

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

De este modo se puede obtener toda los valores attrb de staininfo para todas las etiquetas xyz

3

Si desea recuperar múltiples valores de atributos de la fuente anterior, puede usar findAll y una lista de comprensión para g y 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. 
1

En Python 3.x, sólo tiene que utilizar get(attr_name) en el objeto etiqueta que se obtiene con 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 el 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> 

copias:

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

también puede utilizar 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) 
Cuestiones relacionadas