【问题标题】:Python how to use BeautifulSoap?Python如何使用BeautifulSoup?
【发布时间】:2022-01-18 21:53:20
【问题描述】:

给出以下 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. 谁的名字是CSRFTokenCSRFToken2

我试过了:

return soup.find("input", {"name":"CSRFToken", }, type='hidden').get('value','')

【问题讨论】:

  • 我现在的主要问题是提供名称选项以便它可以匹配多个

标签: python html python-3.x beautifulsoup


【解决方案1】:

我已尽我所能模拟了您的初始情况。您可能仍需要定义适当的解析器。由于您使用 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'

修改此代码以满足您的个人要求

【讨论】:

    【解决方案2】:

    为了实现您的目标,只需选择这两个,将它们放入['CSRFToken','CSRFToken2']

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

    这将为您提供一个标签结果集,您必须对其进行迭代以获取其值。


    作为替代和更通用的方法,您可以将css selectorsdict 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'}
    

    【讨论】:

      猜你喜欢
      • 2018-08-15
      • 2019-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      • 2015-06-07
      • 1970-01-01
      相关资源
      最近更新 更多