2010-04-10 19 views
53

Próbuję wyodrębnić zawartość pojedynczego atrybutu "value" w konkretnym tagu wejściowym na stronie internetowej. Używam następujący kod:Wyodrębnianie wartości atrybutu za pomocą 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) 

otrzymuję TypeError: lista indeksów muszą być liczbami całkowitymi, nie STR

choć z dokumentacji BeautifulSoup Rozumiem, że sznurki nie powinno być problemu, ale tutaj ... nie ma specjalisty i może mnie źle zrozumiałem.

Każda sugestia jest bardzo doceniana! Z góry dzięki.

Odpowiedz

81

.findAll() Zwraca listę wszystkich występujących elementów, więc:

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

inputTag jest lista (prawdopodobnie zawierającym tylko jeden element). W zależności od tego, co chcesz dokładnie należy albo zrobić:

output = inputTag[0]['value'] 

lub użyj .find() metodę, która zwraca tylko jeden (pierwszy) znalezionych elementów:

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

świetne rzeczy! Dzięki. teraz mam pytanie dotyczące analizowania danych wyjściowych, które zawierają wiele znaków spoza zestawu ASCII, ale zadam to w osobnym pytaniu. – Barnabe

+1

nie powinna mieć dostępu do "wartości", jak na http://stackoverflow.com/questions/2616659/extracting-value-in-beautifulsoup. Co sprawia, że ​​powyższy kod działa w tym przypadku? Myślałem, że będziesz musiał uzyskać dostęp do wartości, wykonując 'output = inputTag [0].content' – Seth

+0

@Seth - nie, ponieważ szuka wartości atrybutu znacznika wejściowego, a .contents zwraca tekst zamknięty przez znacznik ( Jestem .contents) - (tylko odpowiadam teraz, ponieważ musiałem podwoić sprawdź, co się dzieje, wyobraź sobie, że ktoś może skorzystać) –

1

I rzeczywiście sugerują Ci oszczędność czasu sposób, aby przejść przy założeniu, że wiesz, jakie znaczniki mają te atrybuty.

przypuśćmy powiedzieć xyz tag ma ten attritube nazwie "staininfo" ..

full_tag = soup.findAll("xyz") 

A ja wa nie można zrozumieć, że full_tag jest lista

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

W ten sposób można uzyskać wszystkie wartości attrb dla staininfo dla wszystkich znaczników xyz

3

Jeśli chcesz pobrać wiele wartości atrybutów z powyższego źródła, możesz użyć findAll i zrozumieć listę do g i wszystko, czego potrzebujesz:

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

W Python 3.x, wystarczy użyć get(attr_name) na obiekcie zmiennych, które się za pomocą 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) 

przeciwko pliku XML conf//test1.xml, który wygląda tak:

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

wydruki:

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

można również użyć tego:

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) 
Powiązane problemy