2013-06-23 131 views
4

说,我有一些HTML从文件,我用perl看起来如下删除HTML代码

<tbody> 
    <tr> 
    <td width="650"> 
    <!--MyComment--> 
     <a href="http://myurl.com"><img src="myimage.png" > </a> 
    <!--MyComment--> 
    </td> 
    </tr> 
    </tbody> 
... 
... 
... 

什么是去除的最佳途径字符串保存在两个注释之间的HTML代码 我正在考虑使用HTML :: tree perl模块

+4

还有'HTML :: Parser'你可以看看,但我不知道它是否足够满足你的需求。取决于你想达到的目标。保持原样,除了'a'标签?如果你有3条评论呢? –

回答

4

一种选择是使用pull语法分析器。这里有一个HTML::TokeParser的例子。它使用两个循环,第一个循环用于查找评论的第一个外观。它打印出找到的每个标签,直到那里。第二个遍历所有标签,直到第二次出现相同类型的评论,并且不打印任何东西。

#!/usr/bin/env perl 

use warnings; 
use strict; 
use HTML::TokeParser; 

my $p = HTML::TokeParser->new (shift); 
while (my $token = $p->get_token) { 
    printf qq|%s|, $token->[0] =~ m/S|E|PI/ ? $token->[ $#$token ] : $token->[1]; 
    if ($token->[0] eq q|C| && $token->[1] =~ m/(?i)MyComment/) { 
    ## Here begins the comment. 
     while (my $token2 = $p->get_token) { 
      if ($token2->[0] eq q|C| && $token2->[1] =~ m/(?i)MyComment/) { 
      ## Here ends the comment. 
       printf qq|%s|, $token2->[1]; 
       last; 
      } 
     } 
    } 
} 

运行它喜欢:的script.pl

内容

perl script.pl htmlfile 

国债收益率:

<html> 
<head> 
<title>Title</title> 
</head> 
<body> 
<tbody> 
    <tr> 
    <td width="650"> 
    <!--MyComment--><!--MyComment--> 
    </td> 
    </tr> 
    </tbody> 
</body> 
</html> 
0

您还可以HTML::Restrict,在默认情况下删除评论做到这一点。需要注意的是,对于HTML :: Restrict,您需要明确地允许您希望保留的所有HTML元素和属性。如果你只是想删除评论,这可能不是适合你的模块,但是如果你还有其他元素需要删除,那么这可能是值得研究的。

+0

这种方式听起来不错,我会看看.. html ::树可以删除基本上是我正在寻找的html节点.. – user2429569

+0

有很多方法可以完成这个,所以如果你已经找到适合你的东西,那很好。 :)只是想指出这个工具超越了你的初始用例。 – oalders