2013-05-26 78 views
6

我一直在寻找一种方法来剥离html文档中的所有内容,只留下html标签。有没有人知道这个方法?我有许多Perl模块的经验,并已彻底搜索此网站。使用Perl剥离除html标签以外的所有内容

我想将html作为字符串传递给我的perl脚本并删除除标记之外的所有内容。这里有一个例子:

传入:

<!doctype html> 
<html> 
<head> 
<title>Example Domain</title> 

<meta charset="utf-8" /> 
<meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 
<meta name="viewport" content="width=device-width, initial-scale=1" /> 
<style type="text/css"> 
body { 
    background-color: #f0f0f2; 
    margin: 0; 
    padding: 0; 
    font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; 

} 
div { 
    width: 600px; 
    margin: 5em auto; 
    padding: 50px; 
    background-color: #fff; 
    border-radius: 1em; 
} 
a:link, a:visited { 
    color: #38488f; 
    text-decoration: none; 
} 
@media (max-width: 700px) { 
    body { 
     background-color: #fff; 
    } 
    div { 
     width: auto; 
     margin: 0 auto; 
     border-radius: 0; 
     padding: 1em; 
    } 
} 
</style>  
</head> 

<body> 
<div> 
    website content .... 
</div> 
</body> 
</html> 

变为:

<html><head><title></title><meta><meta><meta><style></style></head><body><div><h1></h1>  <p></p><p><a></a></p></div></body></html> 
+0

成为了什么?我讨厌它,当人们... – hjpotter92

+0

修复,第一次处理在这个网站上的代码工具。 ;) – user2421267

+0

你想要删除标签属性?如果是这样,你应该可以做一个类似于// – Robbert

回答

2
#!/usr/bin/perl -- 
use strict; 
use warnings; 
use XML::Twig; 

Main(@ARGV); 
exit(0); 

sub Main { 
    if(@_){ 
     nothing_but_tags("$_") for @_; 
    } else { 
     nothing_but_tags(q{<NoTe 
KunG="FoO" 
ChOp="SuEy"> 
NoteKungFo0Ch0pSuEy 
<To KunG="FoO">ToKungFo0 
<Person KunG="FoO">Satan</Person> 
</To> 
<Beef KunG="FoO"> BeefKunGFoO <SaUsAGe KunG="FoO">is Tasty 
</SaUsAGe> 
</Beef> 
</NoTe>}, 
     ); 
    } 
} 

sub nothing_but_tags 
{ 
    my($input, %opt) = @_; 

    $opt{pretty_print} ||= 'indented' ; 

    my $t = XML::Twig->new(
     %opt, 
     force_end_tag_handlers_usage => 1, 
     start_tag_handlers => { 
      _all_ => sub { 
       if($_->has_atts){ 
        $_->set_atts ({}); 
       } 
       return; 
      }, 
     }, 
     end_tag_handlers => { _all_ => sub { $_->flush; return }, }, 
     char_handler => sub { '' }, 
    ); 
    $t->xparse($_[0]); 
    $t->flush(); 
    (); 
} 
__END__ 
<NoTe> 
    <To> 
    <Person></Person> 
    </To> 
    <Beef> 
    <SaUsAGe></SaUsAGe> 
    </Beef> 
</NoTe> 
0

这样的转变是非常简单的使用XSLT,所以这里的使用XML的例子::的libxslt。

#!/usr/bin/perl 
use strict; 

use XML::LibXML; 
use XML::LibXSLT; 

my $filename = $ARGV[0] or die("Usage: $0 filename\n"); 
my $doc  = XML::LibXML->load_html(location => $filename); 

my $stylesheet_doc = XML::LibXML->load_xml(string => <<'EOF'); 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="*"> 
     <xsl:copy> 
      <xsl:apply-templates select="*"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
EOF 

my $xslt  = XML::LibXSLT->new; 
my $stylesheet = $xslt->parse_stylesheet($stylesheet_doc); 
my $result  = $stylesheet->transform($doc); 

print $result->serialize_html; 
0

我不知道如果我深知你的问题,但只留下标签,你可以采取从带标签的输出(只剥去标签),然后替换为空此输出的原始文本。从理论上讲,第一个函数会给你标签外的确切文本,下一步将用null替换这个文本。