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"