Почему я не могу использовать переменную в файле results.find_all?

#python

#python

Вопрос:

Я пытаюсь выполнить довольно простой веб-анализ, но я хотел бы иметь возможность использовать переменные, чтобы мне не приходилось повторять код для нескольких страниц.

пример строки кода:

 elems = results.find_all("span", class_="st_2XVIMK7 st_8u0ePN3 st_2oUi2Vb st_3kXJm4P")
 

Я бы хотел, чтобы это читалось как:

 elems = results.find_all(<variable>) 
 

и тогда пусть моя переменная будет:

 '"span", class_="st_2XVIMK7 st_8u0ePN3 st_2oUi2Vb st_3kXJm4P"'
 

Однако, когда я делаю это, я не получаю никаких результатов. Я включил остальную часть функции ниже. Кто-нибудь знает, почему это не сработает?

РЕДАКТИРОВАТЬ: я также попытался разделить его, как показано в примере ниже, но все равно получаю ту же проблему:

 elems = results.find_all(variable1 , class_=variable2)
variable1 = '"span"'
variable2 = '"st_2XVIMK7 st_8u0ePN3 st_2oUi2Vb st_3kXJm4P"'
 

код:

 def get_name(sym,result,elem,name):
    url = URL   sym
    page = requests.get(url)


    soup = BeautifulSoup(page.content, 'html.parser')
    results = soup.find(id=result)
    elems = results.find_all(elem)


    for elem in elems:
        name_elem = elem.find(name)
        print(name_elem.text)



get_name('top',"app",'"span",class_="st_2XVIMK7 st_8u0ePN3 st_2oUi2Vb st_3kXJm4P"','"span","st_3lrv4Jo"')
 

Ответ №1:

find_all Метод принимает более одного параметра вы просто используете строку в первом аргументе метода который будет изо всех сил пытаться найти чтолибо

вам нужно будет разделить переменную на несколько, поэтому вашу переменную '"span", class_="st_2XVIMK7 st_8u0ePN3 st_2oUi2Vb st_3kXJm4P"' нужно будет разделить на переменные elem = "span" to и class="st_2XVIMK7 st_8u0ePN3 st_2oUi2Vb st_3kXJm4P"

и в вашем коде это будет выглядеть так elems = results.find_all(elem, class)

Еще несколько вещей:
согласно документации https://www.crummy.com/software/BeautifulSoup/bs4/doc/#find-all и то, что я могу найти в Интернете, параметр class принимает Dict со строковым массивом для нескольких значений класса, поэтому ваша функция будет выглядеть больше как
findAll(elem, {'class':['st_2XVIMK7', 'st_8u0ePN3', 'st_2oUi2Vb', 'st_3kXJm4P']})

Комментарии:

1. Я тоже пробовал это. Если вы посмотрите на results = soup.find(id=result) строку, вы увидите, что я ввел «id=», а затем переменную. Это было потому, что у меня там была похожая проблема. Изменение кода на что-то вроде elems = results.find_all(elem, class_=clas) (где elem = «span» и clas = «st_2XVIMK7 st_8u0ePN3 st_2oUi2Vb st_3kXJm4P») по-прежнему не приводит к выводу

2. @whileINside Я не могу комментировать непосредственно ваш пост, НО и переменные не должны " быть в них, variable1 = '"span"' должны быть просто variable1 = 'span' и из документации, чтобы иметь несколько переменных класса, вам нужно поместить их в dict вот так {'class':['class1', 'class2']}