Не могу передать переменную внутрь метода
Этот вопрос звучит как нубский, но меня эта ситуация завела в тупик. Как передать значение внутрь метода findAll?
Пытался и так и эдак:
nrk_all = ["'article', class_='article'"]
nrk_all = "'article', class_='article'"
soup = BeautifulSoup(url.text, 'html.parser')
Не работает:
list_news = soup.findAll(nrk_all[0])
list_news = soup.findAll(nrk_all)
Работает:
list_news = soup.findAll('article', class_='article')
Ответы (3 шт):
Вот рабочий пример:
def f(id, class_):
print(f'id={id} kwargs={class_}')
list = [
(('table',), {'class_': 'table'}),
(('id',), {'class_': 'someclass'}),
]
for args, kwargs in list:
list_news = f(*args, **kwargs)
В вашем коде замените вызов f на soup.findAll.
Выше в примере общий случай, для произвольных параметров. Если нужно передавать только одно значение в позиционных параметрах, то можно упростить:
list = [
('table', {'class_': 'table'}),
('id', {'class_': 'someclass'}),
]
for arg, kwargs in list:
list_news = f(arg, **kwargs)
В общем, оно при передаче почему-то удаляло нижнее подчеркивание у class_
Поэтому список такой:
ski_nordi = [['a' ,'headlinelink'], ['div', 'nameofclass']]
А запрос такой:
for i in ski_nordi:
list_news = soup.findAll(ski_nordi[i][0], class_=ski_nordi[i][1], limit=2)
Метод find_all первым параметром принимает name:
Method signature: find_all(name, attrs, recursive, string, limit, **kwargs)
Значит, если вы хотите передавать через объекты в аргументы метода, то нужна распаковка:
nrk_all = {
'name': 'article',
'class_': 'article',
}
soup = BeautifulSoup(url.text, 'html.parser')
list_news = soup.findAll(**nrk_all)
Для списка это выглядело бы так:
nrk_all_items = [
{
'name': 'article',
'class_': 'article',
},
{
'name': 'article',
'class_': 'article',
},
]
soup = BeautifulSoup(url.text, 'html.parser')
for nrk_all in nrk_all_items:
list_news = soup.findAll(**nrk_all)