Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Re: substitution in textual area of HTML file

by marto (Archbishop)
on Mar 10, 2020 at 16:59 UTC ( #11114086=note: print w/replies, xml ) Need Help??


in reply to substitution in textual area of HTML file

A very quick (sub optimal, I have a long commute to begin) example using Mojo::DOM:

#!/usr/bin/perl use strict; use warnings; use feature 'say'; use Mojo::DOM; my $html = '<ul><div class="txt" style="position:absolute; left:84px; +top:73px;"><span id="f1" style="font-size:11px;vertical-align:baselin +e;color:rgba(0,0,0,1);">technology of S2S translation, also known as +Spoken Language Translation (SLT),</span></div><div class="txt" style +="position:absolute; left:44px; top:73px;"><span id="f1" style="font- +size:11px;vertical-align:baseline;color:rgba(0,0,0,1);">is a new appl +ication of AI,</span></div><li>there</li><li>everyone</li></ul> '; my $dom = Mojo::DOM->new( $html ); # find each span tag foreach my $id ( $dom->find('span')->each ){ # if the text contans the string Spoken if ( index($id->text, 'Spoken') > 0){ # replace the node within the DOM my $text = $id->text; $text =~ s/Spoken/Derp!/g; $id->replace( $text ); } } # print the updated DOM say $dom->content;

Output:

<ul><div class="txt" style="position:absolute; left:84px; top:73px;">t +echnology of S2S translation, also known as Derp! Language Translatio +n (SLT),</div><div class="txt" style="position:absolute; left:44px; t +op:73px;"><span id="f1" style="font-size:11px;vertical-align:baseline +;color:rgba(0,0,0,1);">is a new application of AI,</span></div><li>th +ere</li><li>everyone</li></ul>

Replies are listed 'Best First'.
Re^2: substitution in textual area of HTML file
by Takamoto (Scribe) on Mar 10, 2020 at 17:24 UTC

    Hi Marto, nice script to start with. I just changed it a little bit to preserve the RegEx matching feature instead of the index one.

    #!/usr/bin/perl use strict; use warnings; use feature 'say'; use Mojo::DOM; my $html = '<ul><div class="txt" style="position:absolute; left:84px; +top:73px;"><span id="f1" style="font-size:11px;vertical-align:baselin +e;color:rgba(0,0,0,1);">technology of S2S translation, also known as +Spoken Language Translation (SLT),</span></div><div class="txt" style +="position:absolute; left:44px; top:73px;"><span id="f1" style="font- +size:11px;vertical-align:baseline;color:rgba(0,0,0,1);">is a new appl +ication of AI,</span></div><li>there</li><li>everyone</li></ul> '; my $dom = Mojo::DOM->new( $html ); # find each span tag foreach my $id ( $dom->find('span')->each ){ my $text = $id->text; if ( $text =~ /Spoken/){ $text =~ s/Spoken/Derp!/g; $id->replace( $text ); } } # print the updated DOM say $dom->content;

    Now I can start working on the second phase: matching n-grams across two adjacent DOMs.

      Fewer cars on the road tonight, you could also consider:

      #!/usr/bin/perl use strict; use warnings; use feature 'say'; use Mojo::DOM; my $html = '<ul><div class="txt" style="position:absolute; left:84px; +top:73px;"><span id="f1" style="font-size:11px;vertical-align:baselin +e;color:rgba(0,0,0,1);">technology of S2S translation, also known as +Spoken Language Translation (SLT),</span></div><div class="txt" style +="position:absolute; left:44px; top:73px;"><span id="f1" style="font- +size:11px;vertical-align:baseline;color:rgba(0,0,0,1);">is a new appl +ication of AI,</span></div><li>there</li><li>everyone</li></ul>'; my $dom = Mojo::DOM->new( $html ); $dom->find('span')->each( sub { $_->content( $_->content =~ s/Spoken/D +erp/r ) } ); say $dom->content;

        If my text has some formatting tags (<bold> for example), the formatted text is stripped off.

        my $html = '<ul><div class="txt" style="position:absolute; left:84px; +top:73px;"><span id="f1" style="font-size:11px;vertical-align:baselin +e;color:rgba(0,0,0,1);">technology of S2S translation, <b>also</b> kn +own as Spoken Language Translation (SLT),</span></div><div class="txt +" style="position:absolute; left:44px; top:73px;"><span id="f1" style +="font-size:11px;vertical-align:baseline;color:rgba(0,0,0,1);">is a n +ew application of AI,</span></div><li>there</li><li>everyone</li></ul +> ';

        Becoming:

        <ul><div class="txt" style="position:absolute; left:84px; top:73px;">t +echnology of S2S translation, known as Derp! Language Translation (S +LT),</div><div class="txt" style="position:absolute; left:44px; top:7 +3px;"><span id="f1" style="font-size:11px;vertical-align:baseline;col +or:rgba(0,0,0,1);">is a new application of AI,</span></div><li>there< +/li><li>everyone</li></ul>

        I am starting to realize that my task is more difficult than I thought at first... but working on

        2020-03-11 Athanasius fixed over-wide display of code.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://11114086]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (5)
As of 2020-05-27 22:38 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    If programming languages were movie genres, Perl would be:















    Results (162 votes). Check out past polls.

    Notices?