无需提交即可获取表单url - 使用Python

问题描述:

我有一个包含一个或多个表单的网页。我想要做的是:无需提交即可获取表单url - 使用Python

  1. 识别形式
  2. 发送POST请求,赶上响应。

我在第1点,我使用requests.get和Beautifulsoup来识别网页中的表单。 我的问题是,我怎样才能得到没有提交表单的表单url?

例子:我会搜索“测试”上https://*.com/

的URL看起来像这样:https://*.com/search?q=test

我很感兴趣,让这一部分:/搜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) 
+0

它是窗体(可以是相对的)加上url编码查询(窗体数据)的动作。顺便说一句,这只适用于GET查询。 –

这里有一个工作示例这样做:

>>> import mechanicalsoup                           
>>> browser = mechanicalsoup.StatefulBrowser()                     
>>> browser.open('https://*.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://*.com/search' 

注意,q=不提交URL的一部分,它实际上是部分给这个URL的参数。

根据你想用这个URL做什么,你可能还希望让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://*.com/search?q=How+to+use+MechanicalSoup%3F' 

您可以随时检查浏览器的状态:

>>> browser.launch_browser()