2010-04-10 17 views
53

Sto cercando di estrarre il contenuto di un singolo attributo "valore" in uno specifico tag "input" su una pagina web. Io uso il seguente codice:Estrazione di un valore di attributo 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) 

ottengo un TypeError: lista indici devono essere interi, non str

anche se dalla documentazione BeautifulSoup ho capito che le stringhe non dovrebbe essere un problema, ma qui ... nessuno specialista e io potrei aver frainteso.

Qualsiasi suggerimento è molto apprezzato! Grazie in anticipo.

risposta

81

.findAll() lista rendimenti di tutti gli elementi che si trovano, in modo da:

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

inputTag è una lista (probabilmente contenente un solo elemento). A seconda di cosa si vuole esattamente si sia dovrebbe fare:

output = inputTag[0]['value'] 

o utilizzare .find() metodo che restituisce solo una (prima) trovato elemento:

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

Great stuff! Grazie. ora ho una domanda sull'analisi dell'output che ho un lungo gruppo di caratteri non ASCII, ma lo chiederò in una domanda separata. – Barnabe

+1

non si dovrebbe accedere al 'valore' come http://stackoverflow.com/questions/2616659/extracting-value-in-beautifulsoup. Cosa fa funzionare il codice sopra in questo caso? Pensavo che avresti dovuto accedere al valore facendo 'output = inputTag [0].contents' – Seth

+0

@Seth - no, perché sta cercando l'attributo 'value' di input-tag, e .contents restituisce il testo incapsulato dal tag ( I am .contents) - (solo rispondendo ora perché ho dovuto raddoppiare controllare cosa stava succedendo, capire qualcun altro potrebbe beneficiare) –

1

vorrei davvero suggerire un risparmio di tempo strada da percorrere con questo assumendo che tu sappia che tipo di tag hanno questi attributi.

suppongono dire un tag xyz ha quel attritube denominato "staininfo" ..

full_tag = soup.findAll("xyz") 

E io wan't voi capire che full_tag è una lista

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

Così è possibile ottenere tutte i valori attrb di staininfo per tutti i tag xyz

3

Se si desidera recuperare più valori di attributi dalla sorgente sopra, è possibile utilizzare findAll e una lista di comprensione per et tutto il necessario:

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

In Python 3.x, è sufficiente utilizzare get(attr_name) sul vostro oggetto tag che si ottiene utilizzando 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) 

contro il file XML conf//test1.xml che assomiglia:

<?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> 

stampa:

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

è anche possibile utilizzare questo:

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) 
Problemi correlati