Учитывая следующий ответ html:

<div><input type="hidden" id="CSRFToken" name="CSRFToken" value="HFT/qajA/9FV2kJvMvONwurnFDY6GXZBAA=="/>Login<input type="password" id="LogBox" name="B8d5" /><input type="hidden" name="loginurl" value="/general/status.html"/><input id="login" type="submit" value="&nbsp;" /></div>

Как я могу получить значение всех:

  1. Только скрытые поля

  2. чье имя CSRFToken или CSRFToken2

Я старался:

return soup.find("input", {"name":"CSRFToken", }, type='hidden').get('value','')
-1
Ariel 18 Янв 2022 в 16:11
Моя основная проблема сейчас состоит в том, чтобы предоставить параметры для имени, чтобы оно могло обрабатывать несколько
 – 
Ariel
18 Янв 2022 в 16:15

3 ответа

Привет, я тоже работал с BeautifulSoup и знаю, сколько проблем с этим может быть. Ознакомьтесь с requests-html, который является расширением request, но также с (IMO) лучшими функциональными возможностями, чем BeautifulSoup, для выполнения такой задачи.

0
Krotonix 18 Янв 2022 в 16:17
1
Вы должны показать, как это сделать с помощью requests-html, затем...
 – 
AKX
18 Янв 2022 в 16:21
Это не ответ кстати....
 – 
Ariel
18 Янв 2022 в 16:29

Я максимально смоделировал вашу исходную ситуацию. Возможно, вам по-прежнему потребуется определить соответствующий анализатор. Поскольку вы используете return, я предполагаю, что вы хотите написать функцию.

Просто поместите приведенный здесь код в функцию.

Пример кода

#!pip install beautifulsoup4

#Added a simulated input with name CSRFToken2
simulated_html_input = """<div>
    <input type="hidden" id="CSRFToken" name="CSRFToken" value="HFT/qajA/9FV2kJvMvONwurnFDY6GXZBAA=="/>Login<input type="password" id="LogBox" name="B8d5" />
    <input type="hidden" name="loginurl" value="/general/status.html"/><input id="login" type="submit" value="&nbsp;" />
    <input type="hidden" id="CSRFToken" name="CSRFToken2" value="HFT/qajA/9FV2kJvMvONwurnFDY6GXZBAA==CSRFTOKEN2"/>Login<input type="password" id="LogBox" name="B8d5" />
</div>"""
#Init soup
#Embed code into function if needed
soup = bs(simulated_html_input)
try:
    token_list = soup.find_all('input', {'name': ['CSRFToken','CSRFToken2'], 'type': 'hidden'})
except Exception as e:
    print("Got unhandled exception %s" % str(e))
res = dict()
for i, ele in enumerate(token_list):
    #Modify output as needed 
    res["token_"+str(i)] = ele.get('value')
#In function use return 
print(res)

Вывод:

'token_0': 'HFT/qajA/9FV2kJvMvONwurnFDY6GXZBAA==,
'token_1': 'HFT/qajA/9FV2kJvMvONwurnFDY6GXZBAA==CSRFTOKEN2'

Измените этот код в соответствии с вашими личными требованиями

0
DevStarter101 18 Янв 2022 в 16:52

Чтобы достичь своей цели и просто выбрать эти два, поместите их в ['CSRFToken','CSRFToken2']:

soup.find_all('input', {'name': ['CSRFToken','CSRFToken2'], 'type': 'hidden'})

Это даст вам результирующий набор тегов, которые вы должны перебрать, чтобы получить его значения.


В качестве альтернативного и более общего подхода вы можете использовать css selectors в сочетании с dict comprehension как один из многих вариантов:

Выбрать все скрытые входные данные

soup.select('input[type="hidden"]')

Альтернатива с find_all()

soup.find_all("input", type="hidden")

Перебрать набор результатов

{i.get('name'):i.get('value') for i in soup.select('input[type="hidden"]')}

Перебрать набор результатов, вкл. проверьте, содержит ли имя CSRFToken

{i.get('name'):i.get('value') for i in soup.select('input[type="hidden"]') if 'CSRFToken' in i.get('name')}

Это даст вам набор пар имя/значение в зависимости от ваших условий.

Примере

from bs4 import BeautifulSoup
html='''
<div>
<input type="hidden" id="CSRFToken" name="CSRFToken" value="HFT/qajA/9FV2kJvMvONwurnFDY6GXZBAA=="/>
<input type="hidden" id="CSRFToken2" name="CSRFToken2" value="CSRFTOKEN2VALUE"/>
Login
<input type="password" id="LogBox" name="B8d5" />
<input type="hidden" name="loginurl" value="/general/status.html"/>
<input id="login" type="submit" value="&nbsp;" />
</div>
'''
soup=BeautifulSoup(html)


{i.get('name'):i.get('value') for i in soup.select('input[type="hidden"]') if 'CSRFToken' in i.get('name')}

Выход

{'CSRFToken': 'HFT/qajA/9FV2kJvMvONwurnFDY6GXZBAA==', 'CSRFToken2': 'CSRFTOKEN2VALUE'}
0
HedgeHog 18 Янв 2022 в 16:53