使用perl剥离HTML标记

shi*_*juo 5 html tags perl parsing

什么是在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;
Run Code Online (Sandbox Code Playgroud)

vol*_*ron 10

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


问题


进入正则表达式HTML是一个坏习惯,因为有很多规则和方法来绕过它们,最终可能会使你的代码打开黑客技术.虽然你现在可能对简单的事情有合理的需求,但是重用代码很容易,并且忘记为什么重用代码是个坏主意,特别是当你不添加像# 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'>
Run Code Online (Sandbox Code Playgroud)

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

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


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

您可能更感兴趣的是深入了解所需文档<body>的某些部分(例如,所有内容或其中的某些div内容),而不是剥离HTML文档的某些部分,这就是为什么您最有可能想要其中一个以上模块提供.更不用说,解析器可用于尽力删除所有HTML元素并仅返回text/CData.


Ovi*_*vid 7

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

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

use HTML::Strip;

my $hs         = HTML::Strip->new();
my $clean_text = $hs->parse( $raw_html );
$hs->eof;
Run Code Online (Sandbox Code Playgroud)

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


Jua*_*rro 5

看看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'
Run Code Online (Sandbox Code Playgroud)

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