mldvx4 has asked for the wisdom of the Perl Monks concerning the following question:

I have a rats' nest of div elements that I would like to replace, content, sub elements and all, with a single comment. I can almost do it with the code below, but the comment gets escaped as &lt;!-- --&gt; I would like it to use real tags: <!-- -->

#!/usr/bin/perl use warnings; use strict; use HTML::TreeBuilder; my $root = HTML::TreeBuilder->new_from_file(\*DATA); my $footer = $root->look_down( _tag => q{div}, id => q{footer}, ); $footer->replace_with('<!-- foobar -->'); print $root->as_HTML(undef, " "); __DATA__ <div id="quiteok">ok</div> <div id="footer"> bad <div> stuff <div> and lots of it </div> </div> </div> <div> something good </div>

Replies are listed 'Best First'.
Re: Find and replace specific elements with HTML::TreeBuilder
by Tux (Canon) on May 08, 2016 at 11:53 UTC

    From the docs of HTML::Element:

    Comment pseudo-elements These are element objects with a "$h->tag" value of "~comme +nt", and the content of the comment is stored in the "text" attribut +e ("$h->attr ("text")"). For example, parsing this code with HTML::TreeBuilder... <!-- I like Pie. Pie is good --> produces an HTML::Element object with these attributes: "_tag", "~comment", "text", " I like Pie.\n Pie is good\n "

    Which applied as

    #!/usr/bin/perl use 5.18.2; use warnings; use HTML::TreeBuilder; my $root = HTML::TreeBuilder->new_from_file (\*DATA); $root->look_down (_tag => "div", id => "footer") ->replace_with (HTML::Element->new ("~comment", text => " foobar " +)); say $root->as_HTML (undef, " ", {}); __DATA__ <div id="quiteok">ok</div> <div id="footer"> bad <div> stuff <div> and lots of it </div> </div> </div> <div> something good </div>

    Results in

    <html> <head> </head> <body> <div id="quiteok">ok</div> <!-- foobar --> <div> something good </div> </body> </html>

    Enjoy, Have FUN! H.Merijn

      Thanks. HTML::Elements was what I needed to look at.