activating a webpage's click command from python
Peter Hansen
peter at engcorp.com
Mon Jun 10 14:06:14 EDT 2002
"Grimes, Jessica C" wrote:
>
> I want to create a program that will ask the user what stock he/she
> wants to look up. The program will then extract financial data from
> yahoo and import it into a spreadsheet.
>
> My problem is that I don't know how to make the application take the
> user's input (the stock's ticker symbol) and place the user's input
> from python into the space where yahoo accepts input for a ticker
> symbol and activate yahoo's "Look up" click command.
You should investigate HTML forms. The web page contains a form
which has several fields and a target URL. If you view the source
for the page (in Netscape, hit Ctrl-U; in IE use the View->Source
menu) you can find buried within it the form and the names of the
fields. Forms use the <form> tag and contain <input> fields.
Looking at finance.yahoo.com I can see the form calls "/q" when
executed, and has a field named "s" for the stock symbol. You
can easily take such forms and compose a URL which retrieves the
data. In this case this:
http://finance.yahoo.com/q?s=nt.to
does the job for Nortel on the TSE (disclaimer: anyone even
thinking of buying Nortel should probably just keep thinking :-).
The page returned contains the data, but it's embedded deep
in the HTML and you _really_ don't want to waste much of your
time trying to figure this out. There's got to be a better
approach, but I have never spent the time to research it.
Anyway, the following script does the job in a Pythonically
pragmatic way (in this case, that means "just barely")
import urllib
import re
import sys
URL = 'http://finance.yahoo.com/q?s=%s'
pattern = '%s</a>.*?<b>([0-9.]*)</b>'
symbol = sys.argv[1].upper()
data = urllib.urlopen(URL % symbol).read()
matches = re.findall(pattern % symbol, data)
if len(matches) == 1:
print '%s last trade was %s' % (symbol, matches[0])
else:
print 'Undefined result: %s' % (matches,)
C:\>python tick.py nt.to
NT.TO last trade was 2.69
C:\>python tick.py ibm
IBM last trade was 78.03
C:\>python tick.py engc
Undefined result: []
Hmm... Engenuity Corporation doesn't seem to be listed yet. :-)
-Peter
More information about the Python-list
mailing list