Как получить доступ к значению атрибута тега с помощью BeautifulSoup

Я использую BeautifulSoup и запрашиваю веб-скрейпинг. Я знаю, как извлечь атрибут между тегами, но если мне нужно число '4.31' ниже в теге, есть идеи, как его получить?

<div class="starRating" title="4.31">
<svg
 ...
</svg>
</div>

Я пытался:

soup.find('div',{'class':'starRating'})
soup.find('title')

который ничего не возвращает, поэтому число в основном является тегом...


person ilovebroccoli    schedule 28.12.2019    source источник


Ответы (2)


Вы можете прочитать значение атрибута title следующим образом:

from bs4 import BeautifulSoup


response = """
<html>
<div class="starRating" title="4.31">
<svg>
</svg>
</div>
</html>
"""

soup = BeautifulSoup(response, 'lxml')
print(soup.find('div', {'class': 'starRating'})['title'])

Выходы:

4.31

См. https://www.crummy.com/software/BeautifulSoup/bs4/doc/#attributes `

Тег может иметь любое количество атрибутов. Тег <b id="boldest"> имеет атрибут «id», значение которого «самый жирный». Вы можете получить доступ к атрибутам тега, рассматривая тег как словарь.

person Dan-Dev    schedule 28.12.2019

Вы можете использовать лямбда-выражение для запроса элементов с соответствующим атрибутом title, а затем использовать ключ ["title"] для извлечения нужных данных:

>>> soup.find(lambda x: x.name == "div" and "title" in x.attrs)["title"]
'4.31'

Или используйте селектор CSS:

>>> soup.select_one("div[title]")
<div class="starRating" title="4.31"></div>

Еще проще использовать целевой атрибут как kwarg:

>>> soup.find("div", title=True)
<div class="starRating" title="4.31"></div>

Попытка извлечь атрибут title из элемента, у которого его нет, вызовет KeyError, поэтому его стоит отфильтровать заранее. Используйте find_all или select, если вам нужна итерация нескольких результатов.

person ggorlen    schedule 28.12.2019