koranthala at koranthala at
Wed Jan 14 10:21:58 CET 2009

Does google accept POST?

Anyways, if you dont need to post files, you can use urlencode itself.
def encode_formdata(fields):
        body = urllib.urlencode(dict(<fields>))
        content_type = "application/x-www-form-urlencoded"
        return content_type, body

If you need to post files too, then you will have to use multipart
def encode_multipart_formdata(fields, files):
    fields is a sequence of (name, value) elements for regular form
    files is a sequence of (name, filename, value) elements for data
to be uploaded as files
    Return (content_type, body) ready for httplib.HTTP instance
    BOUNDARY = '----------ThIs_Is_tHe_bouNdaRY_$'
    CRLF = '\r\n'
    L = []
    for (key, value) in fields:
        L.append('--' + BOUNDARY)
        L.append('Content-Disposition: form-data; name="%s"' % key)
    for (key, filename, value) in files:
        L.append('--' + BOUNDARY)
        L.append('Content-Disposition: form-data; name="%s";
filename="%s"' % (key, filename))
        L.append('Content-Type: %s' % mimetypes.guess_type(filename)
[0] or 'application/octet-stream'
    L.append('--' + BOUNDARY + '--')
    body = CRLF.join(L)
    content_type = 'multipart/form-data; boundary=%s' % BOUNDARY
    return content_type, body

Since POST files doesnt work with urllib, you might have to use
httplib - or go for very high level tools like twisted.
I here show an example with httplib.

def post(host, selector, fields, files):
    if files:
       content_type, body = encode_multipart_formdata(fields, files)
       content_type, body = encode_formdata(fields)

    h = httplib.HTTPConnection(host)
    #Spoof Mozilla
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US;
rv: Gecko/2008102920 Firefox/3.0.4',
        'Content-Type': content_type
    h.request('POST', selector, body, headers)
    res = h.getresponse()
    return res.status, res.reason,

Please note that you can use multipart whether or not files are there,
but parsing multipart usually is slower.

Hope this helps.

lilanidha... at wrote:
> Hi,
> I need one complete example of how to do a http post to any site.
> I have tried making a POST to google but all I am returned with is a
> 405 error.
> I don't want to use Pygoogle as I want to try and do this with other
> sites.
> I am also having problems inputing with the param
> I have tried Mechanize. There are no problems with getting data only
> posting.
> >>> headers = {'Content-Type': 'text/html; charset=ISO-8859-1',
> ...         'User-Agent':'Mozilla/4.0',
> ...         'Content-Length':'7'}
> >>> conn = httplib.HTTPConnection("")
> >>> conn.request("POST","/search",params,headers)
> >>> r2 =  conn.getresponse()
> >>> print r2.status, r2.reason
> 405 Method Not Allowed
> Regards,
> Dhaval

More information about the Python-list mailing list