| Finance-Quote documentation | Contained in the Finance-Quote distribution. |
Finance::Quote::ZA - Obtain South African stock and prices from www.sharenet.co.za
use Finance::Quote;
$q = Finance::Quote->new;
# Don't know anything about failover yet...
This module obtains information about South African Stocks from www.sharenet.co.za.
Information available from sharenet may include the following labels:
method source name symbol currency date nav last price
Sharenet website - http://www.sharenet.co.za/
Finance::Quote
| Finance-Quote documentation | Contained in the Finance-Quote distribution. |
#!/usr/bin/perl -w # # ZA.pm # # Version 0.1.1 - # This version corrects the data downloaded by removing spaces and converting # cent values into Rand values this ensures that the Price Editor in GNUCash # can import the data. The rest of the module and all the hard work # remains that of Stephen Langenhoven! # Rolf Endres # 2008.02.18 # # Version 0.1 - Download of South African (ZA) stocks from sharenet # This version based largely upon FinanceCanada.pm module [any errors # are my own of course ;-) ] # # Stephen Langenhoven # 2005.07.19 package Finance::Quote::ZA; require 5.004; use strict; use vars qw /$VERSION/ ; use LWP::UserAgent; use HTTP::Request::Common; use HTML::TableExtract; $VERSION = '1.17'; my $SHARENET_MAINURL = ("http://www.sharenet.co.za/"); my $SHARENET_URL = ($SHARENET_MAINURL."jse/"); sub methods { return (za => \&sharenet); } sub labels { my @labels = qw/method source name symbol currency last date isodate high low p_change/; return (sharenet => \@labels); } sub sharenet { my $quoter = shift; my @symbols = @_; my %info; my ($te, $ts, $row); my @rows; return unless @symbols; my $ua = $quoter->user_agent; foreach my $symbol (@symbols) { my $url = $SHARENET_URL.$symbol; #print "[debug]: ", $url, "\n"; my $response = $ua->request(GET $url); #print "[debug]: ", $response->content, "\n"; if (!$response->is_success) { $info{$symbol, "success"} = 0; $info{$symbol, "errormsg"} = "Error contacting URL"; next; } $te = new HTML::TableExtract(); $te->parse($response->content); #print "[debug]: (parsed HTML)",$te, "\n"; unless ($te->first_table_found()) { #print STDERR "no tables on this page\n"; $info{$symbol, "success"} = 0; $info{$symbol, "errormsg"} = "Parse error"; next; } # Debug to dump all tables in HTML... # print "\n \n \n \n[debug]: ++++ ==== ++++ ==== ++++ ==== ++++ ==== START OF TABLE DUMP ++++ ==== ++++ ==== ++++ ==== ++++ ==== \n \n \n \n"; # # foreach $ts ($te->table_states) {; # # printf "\n \n \n \n[debug]: //// \\\\ //// \\\\ //// \\\\ //// \\\\ START OF TABLE %d,%d //// \\\\ //// \\\\ //// \\\\ //// \\\\ \n \n \n \n", # $ts->depth, $ts->count; # # foreach $row ($ts->rows) { # print "[debug]: ", $row->[0], " | ", $row->[1], " | ", $row->[2], " | ", $row->[3], "\n"; # } # } # # print "\n \n \n \n[debug]: ++++ ==== ++++ ==== ++++ ==== ++++ ==== END OF TABLE DUMP ++++ ==== ++++ ==== ++++ ==== ++++ ==== \n \n \n \n"; # GENERAL FIELDS $info{$symbol, "success"} = 1; $info{$symbol, "method"} = "sharenet"; $info{$symbol, "symbol"} = $symbol; $info{$symbol, "currency"} = "ZAR"; $info{$symbol, "source"} = $SHARENET_MAINURL; # NAME $ts = $te->table_state(2,1); if($ts) { (@rows) = $ts->rows; $info{$symbol, "name"} = $rows[2][1]; }; $info{$symbol, "name"} =~ tr/ //d; # DATE AND CLOSING PRICE $ts = $te->table_state(3,1); # print "[debug]: ", "got this far...", "\n"; # print "[debug]: (table_state)",$ts, "\n"; if($ts) { (@rows) = $ts->rows; # foreach $row ($ts->rows) { # print "[debug]: ", $row->[0], " | ", $row->[1], " | ", $row->[2], " | ", $row->[3], "\n"; # } $quoter->store_date(\%info, $symbol, {eurodate => $rows[0][0]}); $info{$symbol, "last"} = $rows[1][1]; $info{$symbol, "last"} =~ tr/ //d; $info{$symbol, "last"} = 0.01 * $info{$symbol, "last"}; $info{$symbol, "high"} = $rows[2][1]; $info{$symbol, "high"} =~ tr/ //d; $info{$symbol, "high"} = 0.01 * $info{$symbol, "high"}; $info{$symbol, "low"} = $rows[3][1]; $info{$symbol, "low"} =~ tr/ //d; $info{$symbol, "low"} = 0.01 * $info{$symbol, "low"}; $info{$symbol, "p_change"} = $rows[6][1]; $info{$symbol, "p_change"} =~ tr/ //d; } } return wantarray() ? %info : \%info; } 1;