simone
simone

Reputation: 5227

How can I remove an attribute from all DOM elements with Mojolicious?

I want to remove the bgcolor attribute from all elements of a page I am scraping via Mojolicious.

My attempt has been the following:

$dom->all_contents->each(sub { $_->attr('bgcolor' => undef) });

but this seems not to work.

How do I do it right?

Upvotes: 3

Views: 378

Answers (2)

Miller
Miller

Reputation: 35208

The following uses Mojo::DOM to delete the bgcolor attribute for every node:

use strict;
use warnings;

use Mojo::DOM;

my $dom = Mojo::DOM->new(do {local $/; <DATA>});

for my $node ($dom->find('*')->each) {
    delete $node->{bgcolor};
}

print $dom;

__DATA__
<html>
<head>
<title>Hello background color</title>
</head>
<body bgcolor="white">
<h1>Hello world</h1>
<table>
<tr><td bgcolor="blue">blue</td></tr>
<tr><td bgcolor="green">green</td></tr>
</table>
</body>
</html>

Outputs:

<html>
<head>
<title>Hello background color</title>
</head>
<body>
<h1>Hello world</h1>
<table>
<tr><td>blue</td></tr>
<tr><td>green</td></tr>
</table>
</body>
</html>

Notes:

  1. It's possible to use CSS Selectors to limit the returned nodes to only those containing the specific attribute:

    for my $node ($dom->find('[bgcolor]')->each) {
    
  2. One can also let Mojo handle the iteration like the following:

    $dom->find('*')->each(sub {
        delete $_->{bgcolor};
    });
    

Upvotes: 5

Chance
Chance

Reputation: 110

As I understand it, the DOM attribute you're looking for isn't bgcolor but background-color, the css variety. bgcolor fell out of popularity a while ago, in favor of defining classes and using CSS to set the styling on an object (including its background color). Try background-color instead.

Upvotes: -1

Related Questions