Beautifulsoup के साथ एक विशेषता मान निकालना


111

मैं एक वेबपेज पर एक विशिष्ट "इनपुट" टैग में एकल "मूल्य" विशेषता की सामग्री को निकालने की कोशिश कर रहा हूं। मैं निम्नलिखित कोड का उपयोग करता हूं:

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)

मुझे एक TypeError मिलती है: सूची सूचकांकों को पूर्णांक होना चाहिए, str नहीं

भले ही सुंदरसुपर प्रलेखन से मैं समझता हूं कि तार यहां एक समस्या नहीं होनी चाहिए ... लेकिन आईए कोई विशेषज्ञ नहीं है और मुझे गलत समझा जा सकता है।

किसी भी सुझाव बहुत सराहना की है! अग्रिम में धन्यवाद।

जवाबों:


150

.find_all() सभी पाए गए तत्वों की सूची, ताकि:

input_tag = soup.find_all(attrs={"name" : "stainfo"})

input_tagएक सूची है (शायद केवल एक तत्व युक्त)। आप जो चाहते हैं उसके आधार पर आपको या तो करना चाहिए:

 output = input_tag[0]['value']

या उपयोग .find()विधि जो केवल एक (प्रथम) पाया गया तत्व देता है:

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

उत्तम सामग्री! धन्यवाद। अब मेरे पास आउटपुट को पार्स करने के बारे में एक सवाल है, जो गैर-एएससीआईआई चार्ट के लंबे समूह है, लेकिन मैं इसे एक अलग प्रश्न में पूछूंगा।
बरनाबे

3
stackoverflow.com/questions/2616659/… के अनुसार 'मान' को एक्सेस नहीं किया जाना चाहिए । इस मामले में उपरोक्त कोड क्या काम करता है? मैंने सोचा था कि आप ऐसा करके मूल्य का उपयोग करने के लिए होता हैoutput = inputTag[0].contents
सेठ

@ सेठ - नहीं, क्योंकि वह इनपुट-टैग के अट्रिब्यूट 'वैल्यू' की तलाश में है, और कॉनकेंट्स ने टैग द्वारा समझाया गया टेक्स्ट वापस लौटा दिया है (<span> I am .contents </ span>) - (अभी उत्तर दे रहा हूं क्योंकि मेरे पास था। दोहरी जाँच के लिए क्या चल रहा था; किसी और व्यक्ति को लाभ हो सकता है)
डोलन एंटेनुसी

1
बहुत बढ़िया जवाब। हालाँकि, मैं inputTag[0].get('value') इसके बजाय inputTag[0]['value']किसी भी पॉइंटर को रोकने के लिए उपयोग करूँगा यदि कोई मूल्य विशेषता के रूप में टैग न हो
उभयलिंगी

उन लिंक के बारे में जो सीधे विज़िटिंग वेबसाइट के होमपेज से जुड़े नहीं हैं, सभी लिंक कैसे प्राप्त करें चाहे वे सीधे वेबपेज से जुड़े हों या अप्रत्यक्ष रूप से।
रिंक 16

26

में Python 3.x, बस का उपयोग get(attr_name)है कि आप का उपयोग कर पाने के अपने टैग वस्तु पर 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)

XML फ़ाइल के खिलाफ conf//test1.xmlजो दिखता है:

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

प्रिंट:

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

यदि आप PEP 8 का पालन करने और अधिक आधुनिक स्ट्रिंग प्रारूपण विधियों का उपयोग करने के लिए इसे संपादित करते हैं तो क्या आप बुरा मानेंगे?
एएमसी

यह ठीक है, इसके लिए जाओ
उभयचर

6

यदि आप ऊपर दिए गए स्रोत से विशेषताओं के कई मूल्यों को प्राप्त करना चाहते हैं, तो आप अपनी findAllज़रूरत की हर चीज़ को प्राप्त करने के लिए उपयोग कर सकते हैं और सूची की समझ बना सकते हैं :

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.

4

मैं वास्तव में आपको यह मानकर चलने के लिए समय बचाने का सुझाव दूंगा कि आप जानते हैं कि उन विशेषताओं में किस प्रकार के टैग हैं।

मान लीजिए कि एक टैग xyz में उस एट्रीब्यूट का नाम "staininfo" है।

full_tag = soup.findAll("xyz")

और मैं आपको यह नहीं समझना चाहता कि full_tag एक सूची है

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

इस प्रकार आप सभी टैग xyz के लिए staininfo के सभी attrb मान प्राप्त कर सकते हैं


3

आप इसका उपयोग भी कर सकते हैं:

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)

यह उन पुराने उत्तरों से अलग कैसे है जो पहले से ही यहां थे?
एएमसी

0

मैं कुछ तत्वों के सभी वर्ग विशेषताओं का मूल्य प्राप्त करने के लिए सुंदरसुपे 4.8.1 के साथ इसका उपयोग कर रहा हूं:

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])

यह ध्यान रखना महत्वपूर्ण है कि विशेषता कुंजी केवल तब भी एक सूची प्राप्त करती है जब विशेषता का केवल एक मूल्य होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.