d73bf9cbfc1c3d3eb1ecd1b2a1e31acece14c1e8
[perl4caml.git] / examples / loadpage.ml
1 (* Example program which uses LWP::UserAgent and HTML::TreeBuilder to
2  * download an HTTP page and parse it.
3  * Copyright (C) 2003 Merjis Ltd.
4  * $Id: loadpage.ml,v 1.1 2003-10-12 17:33:14 rich Exp $
5  *)
6
7 open Printf
8
9 open Pl_LWP_UserAgent
10 open Pl_HTTP_Request
11 open Pl_HTML_TreeBuilder
12 open Pl_HTML_Element
13
14 let () =
15   (* This is a hack which shouldn't be needed in future. *)
16   Perl.eval "use LWP::UserAgent";
17   Perl.eval "use Net::HTTP";
18
19   let site =
20     if Array.length Sys.argv >= 2 then
21       Sys.argv.(1)
22     else
23       "http://www.merjis.com/" in
24
25   (* Create the UserAgent object. *)
26   let ua = Pl_LWP_UserAgent.new_ ~env_proxy:true () in
27
28   (* Fetch the page. *)
29   let req = Pl_HTTP_Request.new_ "GET" ~uri:site () in
30   let res = ua#request req in
31
32   if not res#is_success then
33     failwith ("Error while fetching " ^ site ^ ": " ^ res#status_line);
34
35   (* Extract the content of the page. *)
36   let content = res#content in
37
38   (* Parse it using HTML::TreeBuilder. *)
39   let tree = Pl_HTML_TreeBuilder.new_from_content content in
40
41   (* Turn the tree into an HTML::Element. *)
42   let tree = tree#elementify in
43
44   (* Print out the resulting tree. *)
45   let rec print root =
46     let tag = root#tag in
47     let attrs = root#all_external_attr in
48     let subnodes = root#content_list in
49
50     printf "Start tag: %s\n" tag;
51     List.iter (fun (name, value) ->
52                  printf "\tAttr: %s=\"%s\"\n" name value) attrs;
53
54     List.iter (fun node ->
55                  match node with
56                      Element node -> print node
57                    | String str ->
58                        printf "String: %s\n" str) subnodes;
59     printf "End tag: %s\n" tag
60   in
61   print tree;
62
63   (* Destroy the Perl interpreter. *)
64   Perl.destroy ()