Python: BeautifulSoup - dapatkan nilai atribut berdasarkan atribut name

98

Saya ingin mencetak nilai atribut berdasarkan namanya, ambil contoh

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

Saya ingin melakukan sesuatu seperti ini

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

Kode di atas memberikan a KeyError: 'name', saya percaya ini karena nama digunakan oleh BeatifulSoup sehingga tidak dapat digunakan sebagai argumen kata kunci.

Ruth
sumber

Jawaban:

162

Ini sangat sederhana, gunakan yang berikut -

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

Tinggalkan komentar jika ada yang tidak jelas.

yang paling keras
sumber
1
bagaimana saya bisa melakukan ini jika saya ingin menemukan semua contoh, yaitu sekarang, soup.find ("meta", {"name": "City"}) ['content'] memberikan hasil pertama, tetapi katakan ada yang lain baris di sup yang <META NAME = 'City "content =" San Francisco ">. bagaimana saya bisa mengubah kode sehingga saya mendapatkan' Austin 'dan' San Francisco '?
overflowname pada
1
Pertanyaan lama, tapi di sini adalah solusi sederhana dalam kasus orang lain datang mencarinya: soup.findAll("meta", {"name":"City"})['content']. Ini akan mengembalikan semua kejadian.
Hannon César
bagaimana saya bisa mendapatkan nilai dari atribut tertentu? berarti saya hanya memiliki atribut ...
Phaneendra Charyulu Kanduri
Apa itu udi u'Austin?
mL siswa33
juga mendapatkan kesalahan kunci ['konten']
mLstudent33
28

yang paling keras menjawab pertanyaan itu tetapi berikut ini cara lain untuk melakukan hal yang sama. Juga, Dalam contoh Anda, Anda memiliki NAME dalam huruf besar dan dalam kode Anda memiliki nama dalam huruf kecil.

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
Lezat
sumber
Ketidakcocokan dalam kasus mungkin disengaja karena BeautifulSoup mengonversi tag menjadi huruf kecil secara default. Dalam hal ini: BeautifulSoup ('<META NAME = "City" content = "Austin">') mengembalikan <meta content = "Austin" name = "City" />
tuckermi
9

6 tahun terlambat ke pesta tetapi saya telah mencari cara mengekstrak nilai atribut tag elemen html , jadi untuk:

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

Saya ingin "addressLocality". Saya terus diarahkan kembali ke sini, tetapi jawabannya tidak benar-benar menyelesaikan masalah saya.

Bagaimana saya berhasil melakukannya pada akhirnya:

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

Karena ini dikt, Anda juga dapat menggunakan keysdan 'nilai'

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

Semoga membantu orang lain!

ron_g
sumber
8

Karya-karya berikut:

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']
Bulan terang
sumber
7

jawaban theharshest adalah solusi terbaik, tetapi FYI masalah yang Anda hadapi berkaitan dengan fakta bahwa objek Tag di Beautiful Soup bertindak seperti kamus Python. Jika Anda mengakses tag ['name'] pada tag yang tidak memiliki atribut 'name', Anda akan mendapatkan KeyError.

Leonard Richardson
sumber
1

Anda juga dapat mencoba solusi ini:

Untuk mencari nilai yang ditulis dalam span of table

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>

Kode Python


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
Ujjaval Moradiya
sumber
1
If tdd='<td class="abc"> 75</td>'
In Beautifulsoup 

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


Result:  abc
Priyank Singhal
sumber
1
Meskipun kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa kode ini memecahkan masalah akan meningkatkan nilai jawaban jangka panjang.
shaunakde