[python] získání dat formuláře z HTML source ; odeslání dat (POST)

petrofF petr0ff na seznam.cz
Pondělí Červen 14 16:22:57 CEST 2010


On 13 čvn, 09:37, petrofF <petr... na seznam.cz> wrote:
> ....
> PROBLÉM = odeslání zprávy:
> A. Načtení stránky s formulářem:
> >>> import httplib2
> >>> h = httplib2.Http('.cache'); response, content = h.request("http://www.vodafonesms.cz/",headers={'cache-control':'no-cache'})
> ....
> Jak ze zdrojového textu ( = content ) získat seznam parametrů + hodnot
> formuláře ? (ve standardní knihovně jsem vhodný modul nenašel)
>
> B. Odeslání POST requestu s daty
> Zde si nejsem jistý, který header Set-Cookie použít (jsou dva)
>
> Díky předem za jakékoli vodítko
> ----------------------------------------------
[ZAPOMNĚL JSEM UPŘESNIT VERZI PYTHONU = 2.5]
(A)

> Jinak na parsování HTML existuje např. BeautifulSoup
> http://www.py.cz/BeautifulSoup

Je to vynikající a přesně to, co potřebuju:

import BeautifulSoup, urllib, httplib2

def getPOSTdata(content, inpDICT={}, formName='smsform'):
    soup=BeautifulSoup.BeautifulSoup(content)
    formTag = soup('form',{'name':formName})[0]
    tags = formTag.findAll(["textarea","input"])
    actualDICT = {}
    getAttr=lambda tag,aName: str(dict(tag.attrs).get(aName,">>> Value
CHYBI <<<"))
    for tag in tags:
	pair={getAttr(tag,"name"):getAttr(tag,"value")}
	actualDICT.update(pair)
	if not inpDICT:
            print pair
    assert inpDICT, "<Listing: FORM-Params>"
    actualDICT.update(inpDICT)
    params = urllib.urlencode(actualDICT)
    return str(formTag["action"]),params

>>> .....
>>> h = httplib2.Http('.cache')
>>> response, content = h.request(url,headers={'cache-control':'no-cache'})
>>> getPOSTdata(content)

{'imgid': 'de0ce7a9acfa910f0641685dd2a51a73'}
{'ppp': '127641611832110:9f8d25f503cd7281478229755d48217c'}
{'locale': 'cz'}
{'number': ''}
{'mynumber': ''}
{'sender': ''}
{'message': '>>> Value CHYBI <<<'}
{'char_in': ''}
{'char_le': ''}
{'parts': ''}
{'pictogram': '>>> Value CHYBI <<<'}
{'send': 'Odeslat!'}
AssertionError: <Listing: FORM-Params>

>>> inp = getInpDICT("12121212")
>>> inp
{'sender': 'Petr Fojtik', 'pictogram': '12121212', 'char_in': '14',
'char_le': '734', 'number': '773695124', 'parts': '1', 'mynumber':
'596874494', 'message': 'Poslana zprava'}
>>> data = getPOSTdata(content,inp)
>>> data
('send.php', 'sender=Petr
+Fojtik&pictogram=12121212&locale=cz&char_in=14&char_le=734&send=Odeslat
%21&number=773695124&parts=1&imgid=de0ce7a9acfa910f0641685dd2a51a73&ppp=127641611832110%3A9f8d25f503cd7281478229755d48217c&message=Poslana
+zprava&mynumber=596874494')

....mělo by následovat:
>>> url += data[0]
>>> response, content = h.request(url, 'POST', headers=headers, data[1])
A zde si nejsem jist přesným obsahem headers (hlavně co se týče
COOKIES),
Zkusil jsem (ve FIREFOXU/Firebug) odchytit komunikaci z orig.webu
Tam ty headers při POSTnutí formu vypadají takto:

REQUEST HEADERS

Host: www.vodafonesms.cz
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:
1.9.0.15) Gecko/2009101601 Firefox/3.0.15 ( )
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/
*;q=0.8
Accept-Language: cs,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://www.vodafonesms.cz/index.php?locale=cz&number=773695124&mynumber=596784494&sender=petroff&message=test
Cookie: SMS_Internet=2879475161.20480.0000;
__gemius_fp=1276059281956_914318332; s_cc=true; s_nr=1276060670069-
New; s_sq=vodaczprod%3D%2526pid%253Dhttp%25253A//www.vodafonesms.cz/
index.php%25253Flocale%25253Dcz%252526number
%25253D773695124%252526mynumber%25253D596784494%252526sender
%25253Dpetroff%252526message%25253Dtest%2526oid%253DOdeslat
%252521%2526oidt%253D3%2526ot%253DSUBMIT;
public_sms_gw=544fe3e1cde33f7378432b5549da6804

RESPONSE HEADERS

Date: Wed, 09 Jun 2010 05:17:04 GMT
Server: Apache
Location: success.php?locale=cz&omniture=
Content-Length: 0
Connection: close
Content-Type: text/html; charset=utf-8
Set-Cookie: SMS_Internet=2879475161.20480.0000; expires=Wed, 09-
Jun-2010 05:47:04 GMT; path=/


Další informace o konferenci Python