如何使用Mojolicious从所有DOM元素中删除属性?

时间:2014-08-27 20:31:13

标签: perl mojolicious

我想从我通过Mojolicious抓取的页面的所有元素中删除bgcolor属性。

我的尝试如下:

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

但这似乎不起作用。

我该怎么做?

2 个答案:

答案 0 :(得分:4)

以下使用Mojo::DOM删除每个节点的bgcolor属性:

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>

输出:

<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>

注意:

  1. 可以使用CSS Selectors将返回的节点限制为仅包含特定属性的节点:

    for my $node ($dom->find('[bgcolor]')->each) {
    
  2. 还可以让Mojo处理迭代,如下所示:

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

答案 1 :(得分:0)

据我了解,您正在寻找的DOM属性不是bgcolor而是background-color,即css品种。 bgcolor暂时不受欢迎,支持定义类并使用CSS在对象上设置样式(包括其背景颜色)。请改为background-color