Extrayendo un valor de atributo con beautifulsoup

5 minutos de lectura

Extrayendo un valor de atributo con beautifulsoup
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!

1646752477 937 Extrayendo un valor de atributo con beautifulsoup
Ł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']

  • ¡Buena cosa! Gracias. ahora tengo una pregunta sobre el análisis de la salida, que es un montón de caracteres que no son ASCII, pero lo haré en una pregunta separada.

    – Bernabé

    10 de abril de 2010 a las 7:33

  • ¿No debería accederse al ‘valor’ según stackoverflow.com/questions/2616659/… . ¿Qué hace que el código anterior funcione en este caso? Pensé que tendrías que acceder al valor haciendo output = inputTag[0].contents

    – set

    11 de abril de 2010 a las 23:31

  • @Seth: no, porque está buscando el atributo ‘valor’ de la etiqueta de entrada, y .contents devuelve el texto encapsulado por la etiqueta (Soy .contents) — (solo respondo ahora porque tenía para verificar dos veces lo que estaba pasando; imagino que alguien más podría beneficiarse)

    – Dolan Antenucci

    27 de julio de 2011 a las 0:33

  • gran respuesta. sin embargo, usaría inputTag[0].get('value') en lugar de inputTag[0]['value'] para evitar ningún puntero en caso de que la etiqueta no tenga un atributo de valor

    – anfibio

    16/11/2016 a las 19:33

  • ¿Qué pasa con los enlaces que no están directamente vinculados a la página de inicio del sitio web que visita? Cómo obtener todos los enlaces, ya sea que estén vinculados a la página web directa o indirectamente.

    – Pista16

    12 de agosto de 2019 a las 7:02


En Python 3.xsimplemente 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

  • ¿Le importaría si edito esto para seguir PEP 8 y ​​usar los métodos de formato de cadena más modernos?

    – AMC

    9 de marzo de 2020 a las 19:35

  • Eso está bien, adelante

    – anfibio

    10 de marzo de 2020 a las 17:55

  • Esta es la respuesta más útil y clara. debe ser el aceptado

    – Alejandro

    11 mayo 2021 a las 23:12

Extrayendo un valor de atributo con beautifulsoup
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'])

  • donde defines color?

    – Darman

    17 oct 2020 a las 19:45

  • Supongo que se olvidó de usar colorName['value'] en lugar de color['value'].

    – Programador gris

    2 de junio de 2021 a las 5:20


Extrayendo un valor de atributo con beautifulsoup
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.

1646752479 107 Extrayendo un valor de atributo con beautifulsoup
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

1646752479 315 Extrayendo un valor de atributo con beautifulsoup
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)

1646752480 437 Extrayendo un valor de atributo con beautifulsoup
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.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad