如何使用BeautifulSoup访问标签的属性值

时间:2019-12-28 20:49:17

标签: python web-scraping beautifulsoup

我正在使用BeautifulSoup,并要求进行网络抓取。我知道如何在标签之间提取属性,但是如果我想要的是标签下面的数字'4.31',知道如何获取它吗?

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

我尝试过:

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

什么都不返回,所以数字基本上就是标签...

2 个答案:

答案 0 :(得分:0)

您可以像这样读取属性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”,其值是“ boldest”。您可以通过将标签视为字典来访问标签的属性

答案 1 :(得分:0)

您可以使用lambda查询具有匹配的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>

更容易地,将target属性用作kwarg:

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

尝试将title属性从没有属性的元素中拉出将引发KeyError,因此值得提前进行过滤。如果您想迭代多个结果,请使用find_allselect