【问题标题】:Get form url without submit - using Python无需提交即可获取表单 url - 使用 Python
【发布时间】:2018-03-18 01:35:49
【问题描述】:

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

  1. 识别表格
  2. 发送发布请求并捕获响应。

我已经完成了第 1 点,我正在使用 requests.get 和 Beautifulsoup 来识别网页中的表单。 我的问题是,如何在不提交表单的情况下获取表单 url?

示例:我将在 https://stackoverflow.com/ 上搜索“测试”

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

我有兴趣获得这部分:/search?q,因为在这些情况下其他网站的 url 更复杂,我想构建一个不依赖于网站的抓取工具。

我尝试过的完整代码:

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)

【问题讨论】:

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

标签: python beautifulsoup python-requests


【解决方案1】:

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

>>> 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()

【讨论】:

    猜你喜欢
    • 2017-03-25
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    相关资源
    最近更新 更多