在 Perl 的 HTML 块中添加我自己的标签

Adding my own tags inside HTML blocks in Perl

提问人:user1000219 提问时间:12/5/2017 更新时间:12/6/2017 访问量:57

问:

有没有办法接收 html 页面、查找块并用我自己的字符将文本括起来?

例如,给定以下 html:

<html>
<head>
    <title>Appleseed Farm</title>
</html>
<body>
<table>
    <tr>
        <td>Col1</td>
        <td>Col2</td>
        <td><img src="blah/blah.jpg"></td> 
        <td></td>
    </tr>
</table>
<div>Some random text</div>
<p>Random image of the day: <img src="random.jpg"></p>
</body>
</html>

在文本周围使用我的“@”标签变成以下内容:

<html>
<head>
     <title>@Appleseed Farm@</title>
</html>
<body>
<table>
    <tr>
        <td>@Col1@</td>
        <td>@Col2@</td>
        <td><img src="blah/blah.jpg"></td> 
        <td></td>
    </tr>
</table>
<div>@Some random text@</div>
<p>@Random image of the day:@ <img src="random.jpg"></p>
</body>
</html>
html perl html 解析

评论

1赞 simbabque 12/5/2017
是的,有办法。事实上,有几个。但不幸的是,在 Stack Overflow 上要求软件推荐是题外话。您必须自己开始,如果您遇到麻烦,我们很乐意提供帮助。如果我是你,我会开始搜索如何替换 HTML 中的文本节点或解析 XML 之类的东西。在CPAN上寻找HTML和XML应该已经给了你一个很好的起点。
1赞 zdim 12/5/2017
@simbabque说的是很好的建议;在 CPAN 和(许多)现有的 SO 帖子中搜索它。为了至少给你一些具体的东西,我使用HTML::TreeBuilder来解析和处理HTML--但还有更多。

答:

0赞 user1000219 12/6/2017 #1

对不起,这个问题不好。在浏览了 HTML::Element 页面后,我确实弄清楚了。

use strict;
use warnings;
use HTML::TreeBuilder;
use feature ':5.10';

my $root = HTML::TreeBuilder->new_from_file(\*DATA);
$root->elementify;

for my $e ($root->look_down (
    sub {
      my $tag = $_[0]->tag();
      grep( /^$tag$/, qw(td div p title span) ) 
      }
  ))
{
    #Do an in-place replacement
    foreach my $item_r ($e->content_refs_list) {
        next if ref $$item_r;
        $$item_r =~ s/^(.+)$/\@$1\@/g;
    }
}

say $root->as_HTML (undef, "  ", {});

__DATA__
<html>
<head>
    <title>Appleseed Farm</title>
</html>
<body>
<table>
    <tr>
        <td>Col1</td>
        <td>Col2</td>
        <td><img src="blah/blah.jpg">Col 3</td> 
        <td>cat</td>
    </tr>
</table>
<div>Some random text</div>
<p>Random image of the day: <img src="random.jpg"></p>
</body>