পাইথন: বিউটিফুলসুপ - নামের অ্যাট্রিবিউটের ভিত্তিতে একটি অ্যাট্রিবিউট মানটি পান


98

আমি এর নামের উপর ভিত্তি করে একটি গুণাবলী মুদ্রণ করতে চাই, উদাহরণস্বরূপ নিন

<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', আমি বিশ্বাস করি এটি হ'ল কারণ নামটি বিটিফুলসপ ব্যবহার করেছেন যাতে এটি কীওয়ার্ড আর্গুমেন্ট হিসাবে ব্যবহার করা যায় না।

উত্তর:


162

এটি বেশ সহজ, নিম্নলিখিতটি ব্যবহার করুন -

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

কিছু পরিষ্কার না হলে একটি মন্তব্য দিন।


4
আমি কীভাবে এটি করতে পারি যদি আমি এখনই সমস্ত দৃষ্টান্ত খুঁজতে চাই, যেমন এখনই স্যুপ.ফাইন্ড ("মেটা", {"নাম": "শহর"}) ['বিষয়বস্তু'] প্রথম ফলাফল দেয় তবে বলে যে অন্যটি ছিল স্যুপ ছিল লাইন <meta NAME এর = 'শহর "বিষয়বস্তু =" সান ফ্রান্সিস্কো "> কিভাবে আমি কোডটি তাই পরিবর্তন পারে আমি পেতে চাই যে।' অস্টিন 'এবং' সান ফ্রান্সিসকো '?
— overflowname

4
প্রাচীন প্রশ্ন হচ্ছে, কিন্তু এখানে অন্য ক্ষেত্রে যেকোন একটি সহজ সমাধান এটি খুঁজছেন আসে রয়েছে: soup.findAll("meta", {"name":"City"})['content']। এটি সমস্ত ঘটনা ফিরে আসবে।
— হ্যানন সিজার

আমি কীভাবে একটি নির্দিষ্ট বৈশিষ্ট্যের মান পেতে পারি? মানে আমার কেবল বৈশিষ্ট্য আছে ...
— ফণীেন্দ্র চর্যুলু কান্দুরী

এর মধ্যে কী uআছে u'Austin?
— ওয়েবনুব 13

এছাড়াও মূল ত্রুটি ['সামগ্রী']
— পেয়েছে

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

ক্ষেত্রে মেলে না probably এই ক্ষেত্রে: বিউটিফুলসপ ('<মেটা নাম = "শহর" সামগ্রী = "অস্টিন">') <মেটা সামগ্রী = "অস্টিন" নাম = "শহর" />
— টাকার্মি

9

পার্টিতে 6 বছর দেরি হয়ে গেছে তবে আমি কীভাবে এইচটিএমএল উপাদানটির ট্যাগ বৈশিষ্ট্য মানটি বের করতে পারি তা অনুসন্ধান করছি:

<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

থারস্টেস্টের উত্তরটি সেরা সমাধান, তবে এফওয়াইআই আপনি যে সমস্যার মুখোমুখি হয়েছিলেন তা হ'ল বিউটিফুল স্যুপের একটি ট্যাগ অবজেক্ট পাইথন অভিধানের মতো কাজ করে। যদি আপনি কোনও ট্যাগে ['নাম'] অ্যাক্সেস করেন যা কোনও 'নাম' বৈশিষ্ট্য না রাখে, আপনি একটি কীআরআর পাবেন।


1

এই সমাধানটিও কেউ চেষ্টা করতে পারেন:

সারণীর ফাঁকে লেখা মানটি

এইচটিএমএল কনটেন্ট


<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

4
যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে এবং / বা কেন এটি সমস্যার সমাধান করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করলে উত্তরের দীর্ঘমেয়াদী মান উন্নত হবে।
— শোনাকদে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.