说我有一个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))
列表理解黑客都没有。
反正有实现目标吗?
答案 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']))
这对我也有用。