2013-06-23 127 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