Domanda

La compagnia di autobus che uso gestisce un sito web terribile ( Hebrew , Inglese ), che fare un semplice "Dalla a alla B calendario oggi" di query un incubo. Ho il sospetto che stanno cercando di incoraggiare l'utilizzo del sistema di interrogazione SMS costosi.

Sto cercando di raccogliere l'intero calendario dal sito, presentando la query per ogni punto possibile ogni punto possibile, che sommare a circa 10k query. Il risultato della query viene visualizzato in una finestra pop-up. Sono abbastanza nuovo di programmazione web, ma familiarità con gli aspetti fondamentali della pitone.

  1. Qual è il modo più elegante per analizzare la pagina, selezionare un valore di fro un menu a discesa, e premere il tasto "Invia" utilizzando uno script?
  2. Come faccio a dare al programma il contenuto del nuovo pop-up come input?

Grazie!

È stato utile?

Soluzione

Twill è un semplice linguaggio di scripting per la navigazione Web. Succede a sport un pitone api .

  

twill è essenzialmente un guscio sottile attorno al pacchetto Mechanize. Tutti i comandi twill sono implementati nel file commands.py, e pyparsing fa il lavoro di analisi input e la sua conversione in comandi Python (vedi parse.py). lavoro shell interattiva e supporto readline viene attuata tramite il modulo cmd (dalla libreria standard Python).

Un esempio di "premere" invia dal documento sopra collegato:

from twill.commands import go, showforms, formclear, fv, submit

go('http://issola.caltech.edu/~t/qwsgi/qwsgi-demo.cgi/')
go('./widgets')
showforms()

formclear('1')
fv("1", "name", "test")
fv("1", "password", "testpass")
fv("1", "confirm", "yes")
showforms()

submit('0')

Altri suggerimenti

Vorrei suggerire di utilizzare Mechanize . Ecco un frammento di codice da loro pagina che mostra come presentare un modulo:


import re
from mechanize import Browser

br = Browser()
br.open("http://www.example.com/")
# follow second link with element text matching regular expression
response1 = br.follow_link(text_regex=r"cheese\s*shop", nr=1)
assert br.viewing_html()
print br.title()
print response1.geturl()
print response1.info()  # headers
print response1.read()  # body
response1.close()  # (shown for clarity; in fact Browser does this for you)

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__)
response2 = br.submit()  # submit current form

# print currently selected form (don't call .submit() on this, use br.submit())
print br.form

È molto raramente vuole in realtà "premere il pulsante di invio", piuttosto che fare richieste GET o POST alla risorsa gestore direttamente. Esaminando il codice HTML in cui la forma è, e vedere che cosa parametri suo sottomettersi a ciò che URL, e se è metodo GET o POST. È possibile formare queste richieste con urllib (2) abbastanza facilmente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top