繁体   English   中英

使用perl剥离HTML标记

[英]strip HTML Tags with perl

什么是在perl中剥离HTML标记的最简单方法。 我正在使用正则表达式从URL中解析HTML,但是如何删除HTML标记?

这是我如何拉我的HTML

 #!/usr/bin/perl -w
use strict;
use warnings;
use LWP::Simple;
my $now_string = localtime;

my $html = get("http://www.spc.noaa.gov/climo/reports/last3hours.html")
    or die "Could not fetch NWS page.";
$html =~ s/<script.*?<\'/script>/sg;
$html =~ s/<.+?>//sg;
$html =~ m{(Hail Reports.*)Wind Reports}s || die;
my @hail = $1;

试图回答你误入歧途的问题


问题


进入正则表达式HTML是一个坏习惯,因为有很多规则和方法来绕过它们,最终可能会使你的代码打开黑客技术。 虽然你现在可能对简单的事情有合理的需求,但是重用代码很容易,忘记为什么重用代码是个坏主意,特别是当你不添加# This code is NOT secure and should not be used to parse HTML anywhere else!!!注释时, # This code is NOT secure and should not be used to parse HTML anywhere else!!! # Christina Alguilera writes songs based on this code!!!

需要大量正则表达式规则的HTML差异示例:

<div>...</div>
<div style="blah">
<div style="background:url(../div)">
<div style=".." class='noticesinglequote'>

列表继续,这仅适用于格式良好的HTML。 其他一些问题包括:

  1. HTML元素关闭不正确(例如<div><span></div></span> )或根本没有关闭
  2. 拼写错误(例如<dvi>..</div>
  3. HTML旨在打破您的脚本
  4. 其他问题:评论,空白,字符集等


您可能已经接受了答案,但您应该查看XML :: ParserHTML :: TreeBuilder

您可能更倾向于深入研究所需文档的一部分(例如<body>所有内容或其中的某个div ),而不是剥离HTML文档的某些部分,这就是您最有可能想要的东西上述模块之一提供。 更不用说,解析器可用于尽力删除所有HTML元素并仅返回text / CData。

如上所述,不要使用正则表达式。 有太多例外。

一个可以提供帮助的CPAN模块是HTML :: Strip

use HTML::Strip;

my $hs         = HTML::Strip->new();
my $clean_text = $hs->parse( $raw_html );
$hs->eof;

值得学习CPAN上可用的内容并使用它。 从长远来看,它将为您节省大量的工作。

看看HTML :: Restrict模块,它允许您去除或限制允许的HTML标记。 剥离所有HTML标记的最小示例:

use HTML::Restrict;

my $hr = HTML::Restrict->new();
my $processed = $hr->process('<b>i am bold</b>'); # returns 'i am bold'

我建议远离HTML :: Strip,因为它破坏了utf8编码

还有一个很好的Perl模块HTML :: Scrubber。

 #!/usr/bin/perl
 use warnings; 
 use strict;
 use HTML::Scrubber;
 my $file = shift or die "need a file $!\n";

 my $html;
 open (FH,"< $file");
 read( FH, $html, -s FH );
 close FH;
 #print "$html\n";

  my $scrubber = HTML::Scrubber->new;
  $scrubber->default(1); ## default to allow HTML

   #$scrubber->script(0); ## no script
   #$scrubber->style(0); ## no style
   # OR
   $scrubber->deny(qw[script style]);

   my $clean_html = $scrubber->scrub($html);

  open (OH, '>', $file.'.scrubbed.html');
  print OH $clean_html;
  close OH;
  exit;

如果您只想删除HTML标记:

s/<script.*?<\/script>//sg
s/<.+?>//sg

这将(大部分时间)删除脚本标记及其内容以及所有其他HTML标记。 您也可以使用正则表达式安全地删除<body>标记之前的所有内容。

但是,对于比这更复杂的东西 ,正则表达式不是一个合适的工具,你真的需要用实际的HTML解析器解析HTML,然后操纵它来删除标签。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM