perl:剥离html标签,操纵文本,然后将html标签返回到原始位置

时间:2013-06-27 22:27:31

标签: html perl nlp strip

我正在使用Html :: Strip模块从文件中删除所有html标签。我想然后操纵生成的文本(剥离html),最后将html标签返回到原始位置。

我正在进行的文本操作需要使用split(/ /,$ text)将文本分成数组。然后,我对结果数组进行一些自然语言处理(包括将 new html标记添加到某些关键字)。一旦我完成处理文本,我想将原始标签返回到他们的位置,同时保持我在此期间完成的文本操作。

如果我可以简单地从原始标记中删除所有空格,我会感到满意(因为浏览器会忽略标记中的空格)。这样我的NLProcessing可以简单地忽略作为标签的单词(包含'<'或'>')。

我已经尝试过潜入Html :: Strip的内容(努力根据我的需要修改它),但是我无法理解下面这段代码的作用:

  my $stripped = $self->strip_html( $text );
  if( $self->decode_entities && $_html_entities_p ) {
    $stripped = HTML::Entities::decode($stripped);
  }

看起来像strip_html是一个sub,但我找不到那个sub。

无论如何,感谢任何建议。


......第二天......

经过与@amon的一些反复讨论之后,我想出了一个我认为足以满足我的目的的解决方案。哈顿把我推向正确的方向,尽管他建议我不要做我做过的事,哈哈。

这是一种野蛮的方法,但可以令人满意地完成工作。要把它留在这里,让别人和我有同样的愿望并且不介意快速而肮脏的解决方案:

my $input = text.html;
my $stripped = $hs->parse($input);
$hs->eof;

所以现在我有两个字符串变量。一个是我想要操作的html文件,另一个是剥离了html的同一个文件。

my @marks = split(/\s/, $stripped);
@marks = uniq(@marks);

现在我有一个列表,列出了我文件中出现的所有非HTMLtag关联词。

$input = HTML::Entities::decode($input);
$input =~ s/\</ \</g; 
$input =~ s/\>/\> /g; 
$input =~ s/\n/ \n /g; 
$input =~ s/\r/ \r /g; 
$input =~ s/\t/ \t /g;

现在我已经解码了包含var的HTML,并确保没有任何单词与“&lt;”或“&gt;”相对应或非空格的空白字符。

foreach my $mark(@marks) { $input =~ s/ \Q$mark\E / TAQ\+$mark\TAQ /g; }
$input =~ s/TAQ\+TAQ//g;

现在我用“+”标记了每个单词,并用TAQ分隔符将非单词中的单词分开。我现在可以拆分TAQ并在执行我的NLP和文本操作时忽略任何不包含“+”的项目。一旦我完成了,我就会重新加入并删除所有的“+”。使用一些聪明的编码,删除我插入的所有额外空格,然后 BAM!我现在已经完成了NLProcessing,操作了文本,并且仍然将所有HTML放在正确的位置。

这里有很多警告,我不打算全部介绍。最有问题的是需要解码然后编码,再加上HTML :: Strip并不总是剥离所有的javascript或无效的HTML。有办法解决这个问题,但我再也没有空间或时间在这里讨论。

感谢您的帮助,我欢迎任何批评或建议。我是新手。

1 个答案:

答案 0 :(得分:0)

模块HTML::Strip使用XS粘合语言将Perl代码与C代码连接起来。您可以找到XS file,例如on(meta-)cpan。它包含一个实现实际算法的文件strip_html.c。由于XS文件中的定义,Perl代码中的strip_html子作为HTML::Strip包的一部分提供。因此,它可以作为适当对象的方法调用。

该段代码的说明

my $stripped = $self->strip_html( $text );

这将调用$text内容的C函数来删除所有HTML标记。然后,已剥离的数据将分配给$stripped

if( $self->decode_entities && $_html_entities_p ) {
  $stripped = HTML::Entities::decode($stripped);
}

使用-p的后缀变量名是lispish tradition来表示布尔变量(或谓词,在数学中)。在此处,它表示是否可以加载HTML::Entitiesmy $_html_entities_p = eval 'require HTML::Entities';。如果配置选项decode_entities设置为真值,并且可以加载HTML::Entities,则实体将在剥离数据中解码。

示例:给出输入

<code> $x &lt; $y </code>

然后剥离会产生

$x &lt; $y

解码实体会使它

$x < $y