[Python + Mechanize] Submit probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Xuj
  • Registratie: November 2009
  • Laatst online: 05-06 11:08
Beste Tweakers,

Momenteel zit ik met een probleem bij het ophalen van data van een website.
Wat ik aan het proberen ben, is mijn rooster ophalen van de site waar die opstaat.

Helaas voor mij, moet deze site gebruik maken van JavaScript navigatie.
Wat ik geprobeerd heb en nog steeds aan het proberen ben, is het oplossen van dit probleem door hetgeen wat de JavaScript functie doet te emuleren in Python.


JavaScript:
1
2
3
4
5
6
function foo(bar, baz) {
    var qux = document.forms["qux"];
    qux.__bar.value = bar.split("#").join("$");
    qux.__baz.value = baz;
    qux.submit();
}


Python:
1
2
3
4
5
def foo(browser, bar, baz):
    qux = browser.select_form("qux")
    browser.form["__bar"] = "$".join(bar.split("#"))
    browser.form["__baz"] = baz
    browser.submit()

Het probleem wat ik hier ervaar, is dat Mechanize de submit() uitvoert met een submit-knop die in het formulier staat. Op de pagina waar ik (of de browser) zit, heb ik echter last van het feit dat de enige submit-knop de 'terug' knop is. Daardoor gaat mechanize.Browser() alleen maar een pagina terug. Helaas.

Momenteel ben ik door de documentatie van Mechanize aan het spitten en workarounds aan het zoeken. Wat ik me nu afvraag is of het niet simpeler is om bijvoorbeeld Internet Explorer aan te sturen via de COM interface (of FireFox - PyXPCOM).

Heeft iemand hier eerder te maken mee gehad en welke keuzes zijn er daar gemaakt?

Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Ik zou mechanize alleen ditchen als je echt veel JS-code moet simuleren (of JS-code die vaak verandert). Hoe werkt het submitten dan op de originele pagina, dat je het niet in mechanize voor elkaar krijgt? En kan je niet gewoon een POST (of GET, wat het form ook aangeeft) request doen met alle waarden die je nodig hebt? mechanize is toch vooral handig als er allemaal sessie-gezeik is (inloggen, cookies, etc).

Rustacean


Acties:
  • 0 Henk 'm!

  • Tim
  • Registratie: Mei 2000
  • Laatst online: 04-08 16:29

Tim

Ik heb nog nooit Mechanize gebruikt, maar als ik de sourcecode doorlees, dan zou het volgens mij moeten kunnen met
Python:
1
mechanize.urlopen(qux._switch_click('request'))

Dat is eigenlijk een private method, dus misschien is het te combineren met een feature request

Acties:
  • 0 Henk 'm!

  • Xuj
  • Registratie: November 2009
  • Laatst online: 05-06 11:08
Allereerst dank voor de antwoorden.

@djc:
Het enige stuk JS-code wat ik gesimuleerd moet hebben staan in mijn eerste bericht.
Op de pagina staat wel een submit knop:

HTML:
1
<input type="submit" value="Terug" />


Maar zoals je kunt zien, is dit niet wat ik zoek. Waar ik last van heb is dat er een onclick-event staat over stukken tekst. Door middel van JavaScript wordt het formulier dan verstuurd.

Ook staan er op de pagina's verborgen input values. Met POST zou ik alsnog naar die pagina's moeten gaan om te zien welke informatie ik mee moet sturen. Vandaar dat ik met de mechanize.Browser() aan de slag ging.

Waarschijnlijk ga ik een poging doen tot het combineren van mechanize.Browser() samen met mechanize.build_opener().

@Tim
Voor zover ik weet, maakt _switch_click() gebruik van submits/buttons die op de pagina staan.
Waar ik last van heb, is dat de submit() die ik moet hebben niet op de pagina staat.

-
Jeetje, toen ik het idee kreeg van 'laat ik mijn rooster via Python' uitlezen, dacht ik niet dat het zo ingewikkeld zou zijn.

Acties:
  • 0 Henk 'm!

  • pascalw
  • Registratie: Februari 2008
  • Laatst online: 05-09 20:23
Los van mechanize, kun je niet gewoon zelf een post request maken naar de url waar die form naar submit?

Acties:
  • 0 Henk 'm!

  • Xuj
  • Registratie: November 2009
  • Laatst online: 05-06 11:08
@PWiddershoven:
Met dat idee was ik begonnen. Mijn eerste idee was het gebruiken van urllib, urllib2 en cookielib. Op iedere pagina staat echter een hidden input, wat geloof ik een hash is van je session.

Om door te gaan naar de pagina waar ik heen wil, moet ik alsnog door de vorige pagina's heen en al die data uitlezen om vervolgens een urlencode eroverheen te gooien.

Het is juist om deze reden dat ik overgestapt ben naar mechanize, aangezien ik via mechanize simpelweg op de submit knop kon 'klikken'.

Momenteel ben ik bezig met een mix: urlencoded post data en de mechanize.Browser().

[ Voor 1% gewijzigd door Xuj op 19-02-2011 14:08 . Reden: typo ]


Acties:
  • 0 Henk 'm!

  • pascalw
  • Registratie: Februari 2008
  • Laatst online: 05-09 20:23
Je zou die hidden input ook met pyquery of beautifulsoup uit kunnen lezen en die informatie in een post request sturen.
Pagina: 1