是否可以获取某个属性的所有值?
示例:
<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']
但是,即使不知道标签,如何对所有标签执行此操作?
答案 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