获取表单URL而不提交 - 使用Python

时间:2017-10-06 09:20:56

标签: python beautifulsoup python-requests

我有一个包含一个或多个表单的网页。我想做的是:

  1. 识别表格
  2. 发送帖子请求并发现回复。
  3. 我已经超过了第1点,我正在使用requests.get和Beautifulsoup来识别网页中的表单。 我的问题是,如何在不提交表单的情况下获取表单网址?

    示例:我将在https://stackoverflow.com/

    上搜索“test”

    网址如下所示:https://stackoverflow.com/search?q=test

    我有兴趣获得这个部分: / search?q ,因为在这些情况下其他网站的网址更复杂,我想建立一个不依赖网站的刮刀。

    我尝试的完整代码:

    from bs4 import BeautifulSoup
    import urllib.request
    import requests
    import mechanicalsoup
    
    #### What?
    search_words=['search1','search2']
    website='http://www.website.com/'
    ####
    s=requests.Session()
    r=s.get(website)
    soup_main = BeautifulSoup(r.content,'lxml')
    
    form=soup_main.find('form')
    print(form)
    param={'searchword':search_words[0]}
    
    method = str(form.get("method"))
    print(method)
    action =form.get("action")
    url = urllib.parse.urljoin(website, action)
    print(action)
    
    request1=requests.Request(method,url,params=param)
    

1 个答案:

答案 0 :(得分:0)

以下是这样做的一个工作示例:

>>> import mechanicalsoup                                                                                                         
>>> browser = mechanicalsoup.StatefulBrowser()                                                                                  
>>> browser.open('https://stackoverflow.com/')                                                                                      
<Response [200]>
>>> form = browser.select_form("form.searchbar")  # Get a form with class 'searchbar'
>>> action = form.form.attrs['action']  # Get the action="" field
>>> browser.absolute_url(action)  # Make the URL absolute
'https://stackoverflow.com/search'

请注意,q=不是提交网址的一部分,它实际上是提供给网址的参数的一部分。

根据您对此网址的处理方式,您可能还想让MechanicalSoup为您提交表单:

>>> browser.select_form("form.searchbar")                                                                                     
<mechanicalsoup.form.Form object at 0x7fb5ae5c3eb8>
>>> browser["q"] = 'How to use MechanicalSoup?'                                                                                       
>>> browser.submit_selected()
<Response [200]>
>>> browser.get_url()
'https://stackoverflow.com/search?q=How+to+use+MechanicalSoup%3F'

您可以随时使用以下方式检查浏览器的状态:

>>> browser.launch_browser()