2017-10-06 63 views
0

我有一個包含一個或多個表單的網頁。我想要做的是:無需提交即可獲取表單url - 使用Python

  1. 識別形式
  2. 發送POST請求,趕上響應。

我在第1點,我使用requests.get和Beautifulsoup來識別網頁中的表單。 我的問題是,我怎樣才能得到沒有提交表單的表單url?

例子:我會搜索「測試」上https://stackoverflow.com/

的URL看起來像這樣:https://stackoverflow.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查詢。 –

回答

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=不提交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://stackoverflow.com/search?q=How+to+use+MechanicalSoup%3F' 

您可以隨時檢查瀏覽器的狀態:

>>> browser.launch_browser()