पायथन: ब्यूटीफुलसप - नाम विशेषता के आधार पर एक विशेषता मान प्राप्त करें


95

मैं इसके नाम के आधार पर एक विशेषता मान मुद्रित करना चाहता हूं, उदाहरण के लिए ले लो

<META NAME="City" content="Austin">

मैं ऐसा कुछ करना चाहता हूं

soup = BeautifulSoup(f) //f is some HTML containing the above meta tag
for meta_tag in soup('meta'):
    if meta_tag['name'] == 'City':
         print meta_tag['content']

उपरोक्त कोड एक देता है KeyError: 'name', मेरा मानना ​​है कि यह इसलिए है क्योंकि नाम का उपयोग BeatifulSoup द्वारा किया जाता है इसलिए इसे एक कीवर्ड तर्क के रूप में उपयोग नहीं किया जा सकता है।

जवाबों:


159

यह बहुत आसान है, निम्नलिखित का उपयोग करें -

>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('<META NAME="City" content="Austin">')
>>> soup.find("meta", {"name":"City"})
<meta name="City" content="Austin" />
>>> soup.find("meta", {"name":"City"})['content']
u'Austin'

कुछ भी स्पष्ट न होने पर टिप्पणी छोड़ दें।


1
मैं यह कैसे कर सकता हूं यदि मैं सभी उदाहरणों को खोजना चाहता हूं, ठीक है, इस समय, सूप .find ("मेटा", {"नाम": "सिटी"}) ['सामग्री'] पहला परिणाम देता है, लेकिन कहते हैं कि दूसरे थे सूप में पंक्ति जो <MET NAME = 'City "सामग्री =" सैन फ्रांसिस्को "> थी। मैं कोड को कैसे संशोधित कर सकता था ताकि मुझे' Austin 'और' San Francisco '
overflowname

1
पुराने सवाल है, लेकिन यहां किसी और मामले किसी में एक सरल उपाय यह की तलाश में आता है: soup.findAll("meta", {"name":"City"})['content']। यह सभी घटनाओं को वापस कर देगा।
हॉनन सेसर

मैं एक विशिष्ट विशेषता का मूल्य कैसे प्राप्त कर सकता हूं? इसका मतलब है कि मेरे पास केवल विशेषता है ...
फणीन्द्र चिरुलु कंदूरी

28

इस सवाल का जवाब सबसे मुश्किल है , लेकिन यहाँ एक ही तरीका है। इसके अलावा, आपके उदाहरण में आपके पास कैप्स में NAME है और आपके कोड में आपका नाम लोअरकेस में है।

s = '<div class="question" id="get attrs" name="python" x="something">Hello World</div>'
soup = BeautifulSoup(s)

attributes_dictionary = soup.find('div').attrs
print attributes_dictionary
# prints: {'id': 'get attrs', 'x': 'something', 'class': ['question'], 'name': 'python'}

print attributes_dictionary['class'][0]
# prints: question

print soup.find('div').get_text()
# prints: Hello World

मामले में बेमेल शायद जानबूझकर है क्योंकि सुंदरसॉफ़्ट डिफ़ॉल्ट रूप से टैग को लोअरकेस में परिवर्तित करता है। इस मामले में: सुंदरसुपर ('<मेटा नाम = "शहर" सामग्री = "ऑस्टिन">') रिटर्न <मेटा सामग्री = "ऑस्टिन" नाम = "शहर" />
tuckermi

9

पार्टी में 6 साल देर हो चुकी है, लेकिन मैं खोज रहा हूं कि html एलिमेंट की टैग एट्रिब्यूट वैल्यू कैसे निकालें , इसके लिए:

<span property="addressLocality">Ayr</span>

मुझे "एड्रेसलोकैलिटी" चाहिए। मुझे यहाँ वापस निर्देशित किया जाता रहा, लेकिन जवाबों ने वास्तव में मेरी समस्या का समाधान नहीं किया।

मैं इसे अंततः कैसे करने में कामयाब रहा:

>>> from bs4 import BeautifulSoup as bs

>>> soup = bs('<span property="addressLocality">Ayr</span>', 'html.parser')
>>> my_attributes = soup.find().attrs
>>> my_attributes
{u'property': u'addressLocality'}

जैसा कि यह एक तानाशाही है, आप तब भी उपयोग कर सकते हैं keysऔर 'मूल्यों'

>>> my_attributes.keys()
[u'property']
>>> my_attributes.values()
[u'addressLocality']

उम्मीद है कि यह किसी और की मदद करता है!


8

निम्नलिखित कार्य:

from bs4 import BeautifulSoup

soup = BeautifulSoup('<META NAME="City" content="Austin">', 'html.parser')

metas = soup.find_all("meta")

for meta in metas:
    print meta.attrs['content'], meta.attrs['name']

7

सबसे मुश्किल जवाब सबसे अच्छा समाधान है, लेकिन FYI करें आप जिस समस्या का सामना कर रहे थे उसे इस तथ्य के साथ करना है कि सुंदर सूप में एक टैग ऑब्जेक्ट पायथन शब्दकोश की तरह काम करता है। यदि आप ऐसे टैग पर [[नाम '] का उपयोग करते हैं, जिसमें' नाम 'विशेषता नहीं है, तो आपको एक KeyError मिलेगी।


1

एक भी इस समाधान की कोशिश कर सकते हैं:

मान ज्ञात करने के लिए, जो तालिका की अवधि में लिखा गया है

htmlContent


<table>
    <tr>
        <th>
            ID
        </th>
        <th>
            Name
        </th>
    </tr>


    <tr>
        <td>
            <span name="spanId" class="spanclass">ID123</span>
        </td>

        <td>
            <span>Bonny</span>
        </td>
    </tr>
</table>

पायथन कोड


soup = BeautifulSoup(htmlContent, "lxml")
soup.prettify()

tables = soup.find_all("table")

for table in tables:
   storeValueRows = table.find_all("tr")
   thValue = storeValueRows[0].find_all("th")[0].string

   if (thValue == "ID"): # with this condition I am verifying that this html is correct, that I wanted.
      value = storeValueRows[1].find_all("span")[0].string
      value = value.strip()

      # storeValueRows[1] will represent <tr> tag of table located at first index and find_all("span")[0] will give me <span> tag and '.string' will give me value

      # value.strip() - will remove space from start and end of the string.

     # find using attribute :

     value = storeValueRows[1].find("span", {"name":"spanId"})['class']
     print value
     # this will print spanclass

1
If tdd='<td class="abc"> 75</td>'
In Beautifulsoup 

if(tdd.has_attr('class')):
   print(tdd.attrs['class'][0])


Result:  abc

1
हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन समस्या को हल करने के तरीके के बारे में अतिरिक्त संदर्भ प्रदान करता है और यह समस्या को हल करता है ताकि उत्तर के दीर्घकालिक मूल्य में सुधार हो सके।
शौनकदे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.