Habaabiai
Habaabiai

Reputation: 725

Fill form values in a web page via a Python script (not testing)

I need to fill form values on a target page then click a button via Python. I've looked at Selenium and Windmill, but these are testing frameworks - I'm not testing. I'm trying to log into a 3rd party website programatically, then download and parse a file we need to insert into our database. The problem with the testing frameworks is that they launch instances of browsers; I just want a script I can schedule to run daily to retrieve the page I want. Any way to do this?

Upvotes: 40

Views: 103586

Answers (5)

Ritesh Khandekar
Ritesh Khandekar

Reputation: 4005

For checkboxes, use 1 & 0 as true & false respectively:

br["checkboxname"] = 1 #checked = true
br["checkboxname2"] = 0 #checked = false

Upvotes: 4

RATHI
RATHI

Reputation: 5289

Have a look on this example which use Mechanize: it will give the basic idea:

#!/usr/bin/python
import re 
from mechanize import Browser
br = Browser()

# Ignore robots.txt
br.set_handle_robots( False )
# Google demands a user-agent that isn't a robot
br.addheaders = [('User-agent', 'Firefox')]

# Retrieve the Google home page, saving the response
br.open( "http://google.com" )

# Select the search box and search for 'foo'
br.select_form( 'f' )
br.form[ 'q' ] = 'foo'

# Get the search results
br.submit()

# Find the link to foofighters.com; why did we run a search?
resp = None
for link in br.links():
    siteMatch = re.compile( 'www.foofighters.com' ).search( link.url )
    if siteMatch:
        resp = br.follow_link( link )
        break

# Print the site
content = resp.get_data()
print content

Upvotes: 20

Abhranil Das
Abhranil Das

Reputation: 5918

The Mechanize example as suggested seems to work. In input fields where you must enter text, use something like:

br["kw"] = "rowling"  # (the method here is __setitem__)

If some content is generated after you submit the form, as in a search engine, you get it via:

print response.read()

Upvotes: 4

Clueless
Clueless

Reputation: 4042

You can use the standard urllib library to do this like so:

import urllib

urllib.urlretrieve("http://www.google.com/", "somefile.html", lambda x,y,z:0, urllib.urlencode({"username": "xxx", "password": "pass"}))

Upvotes: 8

Vinko Vrsalovic
Vinko Vrsalovic

Reputation: 340171

You are looking for Mechanize

Form submitting sample:

import re
from mechanize import Browser

br = Browser()
br.open("http://www.example.com/")
br.select_form(name="order")
# Browser passes through unknown attributes (including methods)
# to the selected HTMLForm (from ClientForm).
br["cheeses"] = ["mozzarella", "caerphilly"]  # (the method here is __setitem__)
response = br.submit()  # submit current form

Upvotes: 33

Related Questions