【问题标题】:Python beautiful soup form input parsingPython美汤形式输入解析
【发布时间】:2014-04-11 00:53:17
【问题描述】:

我的目标是获取所有输入名称和值的列表。将它们配对并提交表格。名称和值是随机的。

from bs4 import BeautifulSoup # parsing

html = """
<html>
<head id="Head1"><title>Title Page</title></head>
<body>
    <form id="formS" action="login.asp?dx=" method="post">

    <input type=hidden name=qw1NWJOJi/E8IyqHSHA== value='gDcZHY+nV' >
    <input type=hidden name=sfqwWJOJi/E8DFDHSHB== value='kgDcZHY+n' >
    <input type=hidden name=Jsfqw1NdddfDDSDKKSL== value='rNg4pUhnV' >
    </form>

</body>

</html>
"""

html_proc = BeautifulSoup(html)

这个位工作正常:

print html_proc.find("input", value=True)["value"]
> gDcZHY+nV

但是,以下语句不起作用或未按预期起作用:

print html_proc.find("input", name=True)["name"]
> TypeError: find() got multiple values for keyword argument 'name'

print html_proc.findAll("input", value=True, attrs={'value'})
> []  

print html_proc.findAll('input', value=True)
> <input name="qw1NWJOJi/E8IyqHSHA==" type="hidden" value="gDcZHY+nV">
> <input name="sfqwWJOJi/E8DFDHSHB==" type="hidden" value="kgDcZHY+n">
> <input name="Jsfqw1NdddfDDSDKKSL==" type="hidden" value="rNg4pUhnV">
> </input></input></input>, <input name="sfqwWJOJi/E8DFDHSHB==" type="hidden" 
> value="kgDcZHY+n">
> <input name="Jsfqw1NdddfDDSDKKSL==" type="hidden" value="rNg4pUhnV">
> </input></input>, <input name="Jsfqw1NdddfDDSDKKSL==" type="hidden" value="rNg4p
> UhnV"></input>

【问题讨论】:

    标签: python html parsing beautifulsoup html-parsing


    【解决方案1】:

    您不能使用BeautifulSoup 提交表单,但以下是获取名称、值对列表的方法:

    print [(element['name'], element['value']) for element in html_proc.find_all('input')]
    

    打印:

    [('qw1NWJOJi/E8IyqHSHA==', 'gDcZHY+nV'), 
     ('sfqwWJOJi/E8DFDHSHB==', 'kgDcZHY+n'), 
     ('Jsfqw1NdddfDDSDKKSL==', 'rNg4pUhnV')]
    

    【讨论】:

    • 谢谢。杰出的。简洁的代码解决方案令人陶醉。
    • 当我的声望更高时,我会回来给你的答案打分。
    • @sarasimple 谢谢,但别担心,很高兴它有帮助。快乐的网络抓取!
    • alcxe,如果我需要提交表格怎么办?你会推荐什么?
    【解决方案2】:
    d = {e['name']: e.get('value', '') for e in html_proc.find_all('input', {'name': True})}
    print(d)
    

    打印:

    {'sfqwWJOJi/E8DFDHSHB==': 'kgDcZHY+n', 
     'qw1NWJOJi/E8IyqHSHA==': 'gDcZHY+nV', 
     'Jsfqw1NdddfDDSDKKSL==': 'rNg4pUhnV'}
    

    在@alecxe 的基础上,这避免了KeyErrors,并将表单解析为字典,更适合requests。

    url = 'http://example.com/' + html_proc.form['action']
    requests.post(url , data=d)
    

    如果这变得更复杂(cookie、脚本),您可能需要Mechanize。


    TypeError 的原因是混淆了 find() 的第一个参数是 'name'。而是html_proc.find("input", attrs={'name': True})。同样对于 attrs 参数,而不是集合 {'value'} 使用字典 {'value': True}。

    【讨论】:

      猜你喜欢
      • 2017-09-29
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      • 2017-01-29
      • 2020-11-23
      • 2018-05-08
      • 2012-10-05
      相关资源
      最近更新 更多