OCaml HTML5 parser/serialiser based on Python's JustHTML
1open Bytesrw
2
3(* DOM manipulation example *)
4
5let html = {|
6<!DOCTYPE html>
7<html>
8<head><title>DOM Example</title></head>
9<body>
10 <div id="content">
11 <p>Original content</p>
12 </div>
13</body>
14</html>
15|}
16
17let () =
18 let result = Html5rw.parse (Bytes.Reader.of_string html) in
19
20 (* Find the content div *)
21 match Html5rw.query result "#content" with
22 | content_div :: _ ->
23 Printf.printf "Original:\n%s\n\n" (Html5rw.Dom.to_html content_div);
24
25 (* Create and append a new element *)
26 let new_para = Html5rw.create_element "p" () in
27 let text_node = Html5rw.create_text "This paragraph was added programmatically!" in
28 Html5rw.append_child new_para text_node;
29 Html5rw.set_attr new_para "class" "dynamic";
30 Html5rw.append_child content_div new_para;
31
32 Printf.printf "After adding element:\n%s\n\n" (Html5rw.Dom.to_html content_div);
33
34 (* Create an element with attributes *)
35 let link = Html5rw.create_element "a"
36 ~attrs:[("href", "https://example.com"); ("target", "_blank")] () in
37 Html5rw.append_child link (Html5rw.create_text "Click here");
38 Html5rw.append_child content_div link;
39
40 Printf.printf "After adding link:\n%s\n\n" (Html5rw.Dom.to_html content_div);
41
42 (* Check attributes *)
43 Printf.printf "Link has href: %b\n" (Html5rw.has_attr link "href");
44 Printf.printf "Link href value: %s\n"
45 (Option.value ~default:"(none)" (Html5rw.get_attr link "href"));
46
47 (* Clone a node *)
48 let cloned = Html5rw.clone ~deep:true content_div in
49 Printf.printf "\nCloned node children: %d\n"
50 (List.length cloned.Html5rw.Dom.children);
51
52 (* Get descendants *)
53 let all_descendants = Html5rw.descendants content_div in
54 Printf.printf "Total descendants: %d\n" (List.length all_descendants)
55
56 | [] ->
57 Printf.printf "Content div not found\n"