2010-04-10 45 views
53

Tôi đang cố trích xuất nội dung của một thuộc tính "giá trị" duy nhất trong thẻ "đầu vào" cụ thể trên trang web. Tôi sử dụng đoạn mã sau:Trích xuất một giá trị thuộc tính với 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) 

tôi nhận được một Lỗi Loại: danh sách chỉ số phải là số nguyên, không str

mặc dù từ tài liệu BeautifulSoup tôi hiểu rằng dây không phải là một vấn đề ở đây ... nhưng Tôi không có chuyên gia và tôi có thể đã hiểu lầm.

Bất kỳ đề xuất nào được đánh giá cao! Cảm ơn trước.

Trả lời

81

.findAll() lợi nhuận danh sách tất cả các yếu tố được tìm thấy, như vậy:

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

inputTag là danh sách (có thể chỉ chứa một phần tử). Tùy thuộc vào những gì bạn muốn chính xác bạn có nên làm:

output = inputTag[0]['value'] 

hoặc sử dụng .find() phương pháp mà trả về chỉ có một (đầu tiên) được tìm thấy yếu tố:

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

Công cụ tuyệt vời! Cảm ơn. bây giờ tôi có một câu hỏi về phân tích cú pháp đầu ra mà tôi một bó dài của ký tự không phải ASCII nhưng tôi sẽ hỏi điều này trong một câu hỏi riêng biệt. – Barnabe

+1

không nên truy cập 'giá trị' theo http://stackoverflow.com/questions/2616659/extracting-value-in-beautifulsoup. Điều gì làm cho mã trên hoạt động trong trường hợp này? Tôi nghĩ bạn sẽ phải truy cập vào giá trị bằng cách thực hiện 'output = inputTag [0].content' – Seth

+0

@Seth - không, bởi vì anh ta đang tìm kiếm giá trị attrib 'của thẻ đầu vào', và .contents trả về văn bản được đóng gói bởi thẻ ( Tôi .contents) - (chỉ trả lời ngay bây giờ vì tôi phải tăng gấp đôi kiểm tra những gì đang diễn ra; tìm một người khác có thể có lợi) –

1

tôi sẽ thực sự đề nghị bạn một thời gian tiết kiệm con đường để đi với điều này giả định rằng bạn biết loại thẻ nào có các thuộc tính đó.

giả sử nói một thẻ xyz có mà attritube tên "staininfo" ..

full_tag = soup.findAll("xyz") 

Và tôi wan't bạn hiểu full_tag đó là một danh sách

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

Vì vậy bạn có thể nhận được tất cả giá trị attrb của staininfo cho tất cả các thẻ xyz

3

Nếu bạn muốn truy xuất nhiều giá trị thuộc tính từ nguồn ở trên, bạn có thể sử dụng findAll và danh sách hiểu cho g et mọi thứ bạn cần:

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

Trong Python 3.x, chỉ cần sử dụng get(attr_name) trên đối tượng thẻ của bạn mà bạn được sử dụng 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) 

chống lại tập tin XML conf//test1.xml trông giống như:

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

bản in:

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

bạn cũng có thể sử dụng điều này:

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) 
Các vấn đề liên quan