Beautiful Soup查找给定属性的所有值,而无需指定标签

时间:2019-05-09 22:46:14

标签: python-3.x web-scraping beautifulsoup

是否可以获取某个属性的所有值?

示例:

<a title="title-in-a">
  <b title="title-in-b"> ... </b>
  <c title="title-in-c"> ... </c>
  <d name="i-dont-care"> ... </d>
</a>

即使标题位于不同的标签中,我也可以获取所有标题吗?

预期结果:

['title-in-a', 'title-in-b', 'title-in-c']

要获取<a>中的所有标题,我知道我可以这样做:

for item in soup.find_all('a'):
    print item['title']

但是,即使不知道标签,如何对所有标签执行此操作?

4 个答案:

答案 0 :(得分:3)

假设您的代码没有错误(意味着<b><c>标签包含在<a>标签中),则:

for i in soup4.find_all(title=True):
  print(i)

将输出:

<a title="title-in-a">
<b title="title-in-b"> ... </b>
<c title="title-in-c"> ... </c>
...</a>
<b title="title-in-b"> ... </b>
<c title="title-in-c"> ... </c>

另一方面,如果每个标签分别关闭,则代码为:

<a title="title-in-a">...</a>
<b title="title-in-b"> ... </b>
<c title="title-in-c"> ... </c>

输出为:

<a title="title-in-a">...</a>
<b title="title-in-b"> ... </b>
<c title="title-in-c"> ... </c>

答案 1 :(得分:2)

使用属性选择器。

titles = [item['title'] for item in soup.select('[title]')]

答案 2 :(得分:1)

这是您的用例的解决方案。有一种称为attrs的默认方法,它将以dict {'name':'value'}

的形式获取所有属性。
response = '''<a title="title-in-a">
  <b title="title-in-b"> ... </b>
  <c title="title-in-c"> ... </c>
  <d name="i-dont-care"> ... </d>
</a>'''
total_attributes = []
soup = BeautifulSoup(response,'lxml')
for tags in soup.find_all():
    attributes = tags.attrs
    #some filtering goes here 
    if attributes:
        required = list(attributes.values())
        total_attributes = total_attributes + required
print(total_attributes)

您可以期望得到类似的结果,也可以在突出显示的地方进行过滤。

['title-in-a', 'title-in-b', 'title-in-c', 'i-dont-care']

答案 3 :(得分:0)

使用python lambda函数搜索标签属性title

from bs4 import BeautifulSoup

data='''<a title="title-in-a">
  <b title="title-in-b"> ... </b>
  <c title="title-in-c"> ... </c>
</a>'''

soup=BeautifulSoup(data,'html.parser')

for item in soup.find_all(lambda tag:[tag.attrs=='title']):
  print(item['title'])

输出:

title-in-a
title-in-b
title-in-c