MechanicalSoup is a Python library for automating interaction with websites. It provides a simple API for navigating, filling out forms, and submitting them, by using BeautifulSoup to parse HTML and uses the requests
library to manage HTTP requests.
Different forms on websites use different types of encodings to send data to the server when submitted. The most common form encodings are:
application/x-www-form-urlencoded
: This is the default encoding and is used for most forms. It sends the form data as a URL encoded string.multipart/form-data
: This encoding is used when a form requires file uploads, as it allows binary data to be sent along with the form fields.text/plain
: This is a less common encoding that sends form data as plain text.
MechanicalSoup can handle different form encodings to some extent. It can certainly handle the default application/x-www-form-urlencoded
encoding and multipart/form-data
for file uploads. Handling text/plain
is less common and might require manual intervention, but it is not typically used for forms that need automation.
Here's how you can use MechanicalSoup to handle forms with different encodings:
application/x-www-form-urlencoded
:
MechanicalSoup will handle this encoding by default when you use form.choose_submit()
and browser.submit_selected()
.
import mechanicalsoup
# Create a browser object
browser = mechanicalsoup.Browser()
# Open the webpage with the form
page = browser.get("http://example.com/form")
# Select the form
form = page.soup.select('form')[0]
# Fill out the form fields
form.input({'name': 'value'})
# Submit the form
response = browser.submit(form, page.url)
multipart/form-data
:
To handle forms with file uploads, you can use the form
object to set the right encoding and add the file.
import mechanicalsoup
# Create a browser object
browser = mechanicalsoup.Browser()
# Open the webpage with the form
page = browser.get("http://example.com/form-with-file-upload")
# Select the form
form = page.soup.select('form')[0]
# Fill out the form fields
form.input({'name': 'value'})
# Add a file to upload
form.add_file(open('file.txt', 'rb'), 'text/plain', 'file.txt')
# Submit the form
response = browser.submit(form, page.url)
MechanicalSoup uses the requests
library for submitting forms, and requests
can handle these content types without any special configuration when using requests.post
.
If you encounter a form with text/plain
encoding and need to automate its submission with MechanicalSoup, you would likely need to construct the request payload manually and use the requests
library directly, as MechanicalSoup's form handling is geared towards the more common encodings.
In summary, MechanicalSoup can handle the most common form encodings (application/x-www-form-urlencoded
and multipart/form-data
) without any issues. If you have to deal with a less common encoding, you might have to work with the requests
library or another tool more directly.