2010-04-10 21 views
53

Bir web sayfasındaki belirli bir "giriş" etiketindeki tek bir "değer" özelliğinin içeriğini ayıklamaya çalışıyorum. Bir TypeError olsunÖznitelik değeri beautifulsoup ile ayıklanıyor

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) 

: Aşağıdaki kodu kullanın BeautifulSoup belgelerinden i dizeleri Burada bir sorun olmamalı anlıyoruz rağmen

str değil, liste endeksleri tamsayı olmalı ... ama uzman değilim ve yanlış anlaşılmış olabilirim.

Herhangi bir öneri çok takdir edilmektedir! Şimdiden teşekkürler. böylece tüm bulunan elemanların

cevap

81

.findAll() döner listesi:

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

inputTag (muhtemelen sadece bir eleman ihtiva eden) bir listesidir.

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

Büyük şeyler! Teşekkürler. Şimdi ASCII olmayan karakterlerin uzun bir demetini çıkaran çıktıyı ayrıştırma hakkında bir sorum var ama bunu ayrı bir soruyla soracağım. – Barnabe

+1

, "değere" http://stackoverflow.com/questions/2616659/extracting-value-in-beautifulsoup adresine göre erişilmemelidir. Yukarıdaki kod bu durumda ne yapar? Değere 'output = inputTag [0] yaparak erişmeniz gerektiğini düşündüm.content ' – Seth

+0

@Seth - no, çünkü giriş etiketinin özniteliğini' değer 'arıyor ve .contents etiketi tarafından kapsüllenmiş metni döndürür ( Ben .contents) - (sadece yanıtladığım için şimdi iki katına çıktım çünkü ne olup bittiğini kontrol edin, başka birinin faydası olabilir) –

1

Gidecek yol tasarrufu size bir zaman önermek aslında olacaktır:

output = inputTag[0]['value'] 

veya sadece bir (ilk) bulunan eleman döndürür .find() yöntemi kullanın: Tam olarak istediğinize bağlı ya yapmalıyım Bu, hangi tür etiketlerin bu özelliklere sahip olduğunu bildiğinizi varsayar.

full_tag = soup.findAll("xyz") 

.. bir etiket xyz "staininfo" adlı bu attritube olduğu görüşünde varsayalım Ve o full_tag bir liste Böylece

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

olduğunu anlamak için wan't tüm alabilirsiniz Tüm etiketler için staininfo xxz

3

attrb değerleri Yukarıdaki kaynaktan birden çok özellik değeri almak istiyorsanız, findAll ve kavramalar için bir liste kavrayışını kullanabilirsiniz. et her şey gerekir:

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

Python 3.x yılında sadece etiket nesne üzerinde get(attr_name) kullanmak size find_all kullanarak olsun o:

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) 

görünüyor XML dosyası conf//test1.xml karşı gibi:

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

baskılar:

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

ayrıca bu kullanabilirsiniz:

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)