Python: AttributeError: объект «ResultSet» не имеет атрибута «получить»

Когда я пытаюсь извлечь значение с веб-сайта и поместить его в запрос полезной нагрузки, я получаю сообщение об ошибке:

AttributeError: 'ResultSet' object has no attribute 'get'

Это мой код:

resumeURL='url'
response=self.session.get(resumeURL,headers=headers)
soup=BeautifulSoup(response.content, "html.parser")

product=soup.find_all('input',{'name':'_CsrfToken', 'type':'hidden'})
payload = {
    '_CsrfToken':product.get('value')

Когда я меняю find_all на find, я получаю сообщение об ошибке:

AttributeError: 'NoneType' object has no attribute 'get'

Что я делаю не так?


person Sid    schedule 01.03.2018    source источник
comment
Как говорится в сообщении об ошибке, product равно None. soup.find_all() возвращает None, когда не находит совпадающих элементов, так что, вероятно, проблема в этом. Простого print(product) будет достаточно, чтобы проверить эту гипотезу.   -  person kindall    schedule 02.03.2018
comment
_CsrfToken определенно находится на странице.   -  person Sid    schedule 02.03.2018
comment
Упс, спасибо @Alasdair   -  person kindall    schedule 02.03.2018
comment
print(product) дает мне весь код, я ищу значение CsrfToken   -  person Sid    schedule 02.03.2018
comment
когда я печатаю (продукт), я получаю: ‹input name=_CsrfToken type=hidden value=4b2adc0df11241b18af7b88c0e1764bd› ‹div class=form-group› ‹label for=firstNameInput›First name‹/label› ‹input class=form-control id= firstNameInput name=firstName placeholder=First Name required= type=text› ‹/input›‹/div› ‹div class=form-group› Как теперь я могу получить значение _CsrfToken и поместить его в свою полезную нагрузку?   -  person Sid    schedule 02.03.2018
comment
Отвечает ли это на ваш вопрос? Beautiful Soup: объект "ResultSet" не имеет атрибута "find_all"?   -  person AMC    schedule 23.03.2020


Ответы (2)


Взято прямо из прекрасной документации:

AttributeError: объект «ResultSet» не имеет атрибута «foo». Обычно это происходит, потому что вы ожидали, что find_all() вернет один тег или строку. Но find_all() возвращает список тегов и строк — объект ResultSet. Вам нужно перебрать список и посмотреть .foo каждого из них. Или, если вам действительно нужен только один результат, вам нужно использовать find() вместо find_all().

Поэтому, если вам нужны все результаты, а не только один, вам нужно перебрать весь ваш набор результатов (например, product) и найти .get каждого из них. Итак, что-то вроде:

for val in product:
  #check the val.get('value') for each member of list
  print val.get('value')
person kingJulian    schedule 01.03.2018
comment
Когда я делаю для продукта в продукте: print(data.get('value')) я получаю значение, однако, как теперь я могу добавить его в полезную нагрузку? - person Sid; 02.03.2018
comment
В общем, синтаксис для обновления dict — dict_name[key] = "value", поэтому вы можете сделать payload[_CsrfToken] = x, где x — это data.get('value') набора результатов, который вы хотите поместить в _CsrfToken. - person kingJulian; 02.03.2018

Я думаю, что метод get следует использовать в одном элементе ResultSet (а не во всем наборе). Я имею в виду, где вы делаете:

product.get('value')

пытаться:

product[0].get('value')
person Daniel Garrido    schedule 01.03.2018
comment
Это дает мне ошибку: TypeError: объект «NoneType» не имеет атрибута «getitem». - person Sid; 02.03.2018