如何使用BeautifulSoup访问标签的多个属性?

时间:2020-09-10 10:48:11

标签: python beautifulsoup

说我有一个HTML标签<span id="sample" value="type-2" data-type="haulted" encryption_stat="False"></span>

我想访问其所有属性的值而不使用循环和列表理解方法,并且我有一个属性列表来访问span标签的['data-type','encryption-stat','value']

所以基本上我不想尝试这个:

from bs4 import BeautifulSoup
s = '<span id="sample" value="type-2" data-type="haulted" encryption_stat="false"></span>'
data = BeautifulSoup(s,'html.parser')
values = []
for i in ['data-type','encryption_stat','value']:
    values.append(data.find('span',id='sample').get(i))

列表理解黑客都没有。

反正有实现目标吗?

3 个答案:

答案 0 :(得分:1)

如果您不想使用循环,则可以使用operator.itemgetter

from bs4 import BeautifulSoup
from operator import itemgetter

s = '<span id="sample" value="type-2" data-type="haulted" encryption_stat="false"></span>'
data = BeautifulSoup(s,'html.parser')


attrs = ['data-type','encryption_stat','value']
span = data.select_one('#sample')

i = itemgetter(*attrs)
print(i(span.attrs))

打印:

('haulted', 'false', 'type-2')

或者:要处理缺少的属性,您可以执行以下操作:

i = itemgetter(*(span.attrs.keys() & attrs))
print(i(span.attrs))

答案 1 :(得分:0)

尝试使用element.attrs,然后找到值。

from bs4 import BeautifulSoup
s = '<span id="sample" value="type-2" data-type="haulted" encryption_stat="false"></span>'
data = BeautifulSoup(s,'html.parser')
item_attrs=data.find('span',id='sample').attrs
for item_attr in item_attrs:
    print(data.find('span',id='sample')[item_attr]) 

如果要忽略任何特定的属性,请使用if子句。

from bs4 import BeautifulSoup
s = '<span id="sample" value="type-2" data-type="haulted" encryption_stat="false"></span>'
data = BeautifulSoup(s,'html.parser')
item_attrs=data.find('span',id='sample').attrs
for item_attr in item_attrs:
    if 'id' not in item_attr:
      print(data.find('span',id='sample')[item_attr])

答案 2 :(得分:0)

是的,所以我找到了答案的方法,我认为值得在这里为所有人做出贡献。

我使用map()

进行了尝试
>>> list(map(data.find('span',id='sample').get,['data-type','encryption_stat','value']))

@KunduK的回答启发了另一个人,使用了map()

>>> all = data.find('span',id='sample').attrs
>>> list(map(all.__getitem__,['data-type','encryption_stat','value']))

这对我也有用。