Python: BeautifulSoup - отримати значення атрибута на основі атрибута name


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 використовує ім'я, тому його не можна використовувати як аргумент ключового слова.

Відповіді:


160

Це досить просто, використовуйте наступне -

>>> 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
як я можу це зробити, якщо я хочу знайти всі екземпляри, тобто прямо зараз, sou.find ("meta", {"name": "City"}) ['content'] дає перший результат, але кажуть, що були й інші рядок у супі, який був <META NAME = 'City "content =" San Francisco ">. як я можу змінити код, щоб я отримав" Остін "і" Сан-Франциско "?
overflowname

1
Старий питання, але ось просте рішення в разі , якщо хто - то буде шукати їх: soup.findAll("meta", {"name":"City"})['content']. Це поверне всі випадки.
Хеннон Сезар,

як я можу отримати значення конкретного атрибута? означає, що я маю лише атрибут ...
Phaneendra Charyulu Kanduri

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

Невідповідність у випадку є, мабуть, навмисною, оскільки BeautifulSoup за замовчуванням перетворює теги у малі регістри. У цьому випадку: BeautifulSoup ('<META NAME = "City" content = "Austin">') повертає <meta content = "Austin" name = "City" />
tuckermi

9

Запізнення на вечірку на 6 років, але я шукав, як витягнути значення атрибута тегу елемента html , тому для:

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

Я хочу "addressLocality". Мене постійно повертали сюди, але відповіді насправді не вирішили моєї проблеми.

Як мені це вдалося врешті-решт:

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

відповідь theharshest є найкращим рішенням, але FYI проблема, з якою ви зіткнулися, пов'язана з тим, що об'єкт Tag у Beautiful Soup діє як словник Python. Якщо ви звертаєтесь до тегу ['name'] до тегу, який не має атрибута 'name', ви отримаєте 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>

Код 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

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

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


Result:  abc

1
Хоча цей код може відповісти на питання, надання додаткового контексту щодо того, як та / або чому він вирішує проблему, покращило б довгострокове значення відповіді.
шаунакде
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.