2013-05-26 6 views
6

Tôi đã tìm kiếm một cách để tách mọi thứ ra khỏi tài liệu html chỉ để lại các thẻ html. Có ai biết về một phương pháp cho việc này không? Tôi có kinh nghiệm với nhiều mô-đun perl và đã tìm kiếm kỹ lưỡng trang này.Tước mọi thứ trừ các thẻ html bằng cách sử dụng perl

Tôi muốn chuyển html dưới dạng chuỗi thành tập lệnh perl của mình và xóa mọi thứ ngoại trừ các thẻ. Dưới đây là một ví dụ:

Incoming:

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

trở thành:

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

Trở thành cái gì? Tôi ghét nó khi mọi người ... – hjpotter92

+0

Cố định, lần đầu tiên xử lý công cụ mã trên trang này. ;) – user2421267

+0

Bạn cũng muốn xóa các thuộc tính thẻ? Nếu vậy, bạn sẽ có thể thực hiện reg cũ như// – Robbert

Trả lời

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

Như một chuyển đổi là rất đơn giản với XSLT, vì vậy đây là một ví dụ sử dụng 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

Tôi không biết liệu tôi có hiểu rõ câu hỏi của bạn hay không. Về lý thuyết hàm đầu tiên sẽ cung cấp cho bạn văn bản chính xác nằm ngoài các thẻ và bước tiếp theo sẽ thay thế văn bản này bằng null.