<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><br></div><div>Here is an old script that reads stock prices, but it still runs. -- Matthias</div><div><br></div><div><br></div><div><div>#lang racket&nbsp;</div><div><br></div><div>(require net/url net/uri-codec)</div><div><br></div><div>#;</div><div>(require (lib "url.ss" "net")</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(lib "uri-codec.ss" "net")</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(lib "list.ss")</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(lib "contract.ss"))</div><div><br></div><div>(current-alist-separator-mode 'amp)</div><div><br></div><div>(define-struct no-quote (company reason))</div><div>;; no-quote = (make-no-quote String String)</div><div><br></div><div>(provide/contract</div><div>&nbsp;(stock-quote &nbsp; &nbsp; (string? &nbsp; . -&gt; . (or/c number? string?)))</div><div>&nbsp;;; stock-quote may also raise a no-quote exception:</div><div>&nbsp;; (no-quote? &nbsp; &nbsp; &nbsp; (any? &nbsp; &nbsp; &nbsp;. -&gt; . boolean?))</div><div>&nbsp;; (no-quote-reason (no-quote? . -&gt; . string?))</div><div>&nbsp;)&nbsp;</div><div><br></div><div><br></div><div>#| ----------------------------------------------------------------------------</div><div>&nbsp; Stock and Fund Quotes</div><div>&nbsp; ---------------------</div><div>&nbsp; This module implements an extremely simple stock quote server. The quote&nbsp;</div><div>&nbsp; server sends a query to SOURCE and then looks for a the textual pattern&nbsp;</div><div>&nbsp; PATTERN in the resulting page. This process is brittle, and it has broken</div><div>&nbsp; over the years but it's easy to fix. -- If someone has a more reliable</div><div>&nbsp; method for obtaining stock quotes, by all means replace the implementation</div><div>&nbsp; of the module with something better.&nbsp;</div><div>&nbsp; |# &nbsp;&nbsp;</div><div><br></div><div>(define SOURCE "<a href="http://finance.yahoo.com/q?s=~a&amp;d=v1">http://finance.yahoo.com/q?s=~a&amp;d=v1</a>")</div><div><br></div><div>(define PATTERN "([0-9\\.]+)&lt;/span&gt;&lt;/span&gt;")</div><div><br></div><div>(define (stock-quote company)</div><div>&nbsp; (with-handlers ([no-quote? no-quote-reason])</div><div>&nbsp; &nbsp; (let* ([PG (send-query company (form-query company))]</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; [_1 (printf "~a~n" PG)]</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[LN (filter find PG)]</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; [_2 (printf "~a~n" LN)]</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[QT (extract-quote company LN)])</div><div>&nbsp; &nbsp; &nbsp; ; (printf "~a~n" QT)</div><div>&nbsp; &nbsp; &nbsp; (string-&gt;number QT))))</div><div><br></div><div>;; String -&gt; URL&nbsp;</div><div>;; create a URL for the stock query to the server&nbsp;</div><div>(define (form-query company)&nbsp;</div><div>&nbsp; (string-&gt;url (format SOURCE company))) &nbsp; &nbsp;</div><div><br></div><div>;; String URL -&gt; (listof String)</div><div>;; contract the page at URL with a query; produce list of lines from response</div><div>;; raises no-stock-quote if it can't find the server or something goes wrong</div><div>(define (send-query company URL)</div><div>&nbsp; (with-handlers</div><div>&nbsp; &nbsp; &nbsp; ([exn:fail:network?&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; (lambda (e) (raise (make-no-quote company (exn-message e))))])</div><div>&nbsp; &nbsp; (call/input-url URL get-pure-port read-a-page)))</div><div><br></div><div>;; Iport -&gt; (listof String)</div><div>;; reading a page from ip as a list of lines</div><div>(define (read-a-page ip)</div><div>&nbsp; (let reader ()</div><div>&nbsp; &nbsp; (let ([next (read-line ip)])</div><div>&nbsp; &nbsp; &nbsp; (cond</div><div>&nbsp; &nbsp; &nbsp; &nbsp; [(eof-object? next) '()]</div><div>&nbsp; &nbsp; &nbsp; &nbsp; [else (cons next (reader))]))))</div><div><br></div><div><br></div><div>;; String (union #f (list String String)) -&gt; String</div><div>(define (extract-quote company LN)</div><div>&nbsp; (if (pair? LN)</div><div>&nbsp; &nbsp; &nbsp; ; (cadr (find (car LN)))</div><div>&nbsp; &nbsp; &nbsp; (cadr (find (car LN)))</div><div>&nbsp; &nbsp; &nbsp; (raise</div><div>&nbsp; &nbsp; &nbsp; &nbsp;(make-no-quote&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; company</div><div>&nbsp; &nbsp; &nbsp; &nbsp; (format "couldn't find a quote for ~a" company)))))</div><div><br></div><div>;; String -&gt; (union #f (list String String))</div><div>;; find PATTERN in x or produce false&nbsp;</div><div>(define (find x) (regexp-match PATTERN x))</div><div><br></div><div><br></div><div>#|</div><div>&nbsp; ;; tests:</div><div>&nbsp; (require (lib "testing.scm" "testing"))</div><div><br></div><div>&nbsp; (define (good-number? x)</div><div>&nbsp; &nbsp; (test-p x number? "not a positive number"))</div><div>&nbsp; ; (lambda (x) (and (number? x) (&gt; x 0)))</div><div><br></div><div>&nbsp; (define merck &nbsp; "&lt;b&gt;29.99&lt;/b&gt;&lt;/big&gt;&lt;/td&gt;")</div><div>&nbsp; (test-p (find merck) pair? "pattern not found")</div><div>&nbsp; (test-p (filter find (list "" merck "" merck "")) pair? "filter find")</div><div>&nbsp;&nbsp;</div><div>&nbsp; (test-p (extract-quote "mrk" (filter find (list "" merck ""))) string?&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "extract-quote")</div><div>&nbsp; (test-e (extract-quote "mrk" (filter find (list "" "xxx" ""))) no-quote&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "extract-quote")</div><div><br></div><div>&nbsp; (printf "make sure you're connected when you run these test~n")</div><div>&nbsp; (good-number? (stock-quote "PRSCX")) ; a fund: T Rowe Price Science &nbsp;</div><div>&nbsp; (good-number? (stock-quote "MRK")) ; a stock: Merck&nbsp;</div><div>&nbsp; (test== (string? (stock-quote "XXXXXXX")) #t "bad stock found")</div><div>&nbsp;&nbsp;</div><div>&nbsp; (printf "make sure you are *not* connected when you run these test~n")</div><div>&nbsp; (test-p (stock-quote "MRK") string? "number found despite lack of connection")</div><div>&nbsp; |#</div><div><br></div></div><div><br></div><br><div><div>On Jun 12, 2013, at 3:10 PM, Frank Weytjens wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div dir="ltr"><br clear="all"><div style="">Hi Racket users,</div><div style=""><br></div><div style="">I'm trying to extract some information from a webpage.</div><div style="">First attempt is to read the complete page</div><div style="">
Later i will try to filter the StockPrice and Volume at a certain time</div><div style="">The goal is to calculate what direction the StocPrice is moving in</div><div style="">multiplied by the number of Stocks that changed owner during vast amounts of time.</div>
<div style="">Like if it was a moving/accelerating mass in fysics and you want to know it's momentum</div><div style="">The value of this program is void.</div><div style="">It's just for fun.</div><div style=""><br></div><div style="">
The first problem I encounter is that reading the webpage stops at the first curly bracket<br></div><div style=""><br></div><div style=""><div>#lang racket</div><div>(require net/url)</div><div>(define GLE (get-pure-port (string-&gt;url "<a href="http://www.tijd.be/beurzen/Societe_Generale.360017048">http://www.tijd.be/beurzen/Societe_Generale.360017048</a>")))</div>
<div>(define readPage</div><div>&nbsp; (lambda (ticker)</div><div>&nbsp; &nbsp; (read/recursive ticker)))</div><div>(define readMore</div><div>&nbsp; &nbsp; (lambda ()</div><div>&nbsp; &nbsp; &nbsp; (let ([length &nbsp;(pipe-content-length GLE)])&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; (if (&lt; (file-position* GLE) length) ((display (readPage GLE)) (readMore)) (print 'Finished)))))</div>
<div><br></div><div style="">(readMore)</div><div style=""><br></div><div style=""><br></div><div style="">error --&gt; .....ascript&gt;djConfig=. read: unexpected `}'</div><div style=""><br></div><div style=""><br></div><div style="">Sorry for the naive code, i'm just a beginner.</div>
<div style=""><br></div><div style="">Thanks in advance</div></div><div style="">&nbsp;</div><div style="">Frank</div></div>
____________________<br> &nbsp;Racket Users list:<br> &nbsp;<a href="http://lists.racket-lang.org/users">http://lists.racket-lang.org/users</a><br></blockquote></div><br></body></html>