Учитывая следующий ответ 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=" " /></div>
Как я могу получить значение всех:
Только скрытые поля
чье имя
CSRFToken
илиCSRFToken2
Я старался:
return soup.find("input", {"name":"CSRFToken", }, type='hidden').get('value','')
3 ответа
Привет, я тоже работал с BeautifulSoup и знаю, сколько проблем с этим может быть. Ознакомьтесь с requests-html, который является расширением request
, но также с (IMO) лучшими функциональными возможностями, чем BeautifulSoup, для выполнения такой задачи.
requests-html
, затем...
Я максимально смоделировал вашу исходную ситуацию. Возможно, вам по-прежнему потребуется определить соответствующий анализатор. Поскольку вы используете 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=" " />
<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'
Измените этот код в соответствии с вашими личными требованиями
Чтобы достичь своей цели и просто выбрать эти два, поместите их в ['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=" " />
</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'}
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.