无需提交即可获取表单url - 使用Python
问题描述:
我有一个包含一个或多个表单的网页。我想要做的是:无需提交即可获取表单url - 使用Python
- 识别形式
- 发送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)
答
这里有一个工作示例这样做:
>>> 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()
它是窗体(可以是相对的)加上url编码查询(窗体数据)的动作。顺便说一句,这只适用于GET查询。 –