我正在使用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。有办法解决这个问题,但我再也没有空间或时间在这里讨论。
感谢您的帮助,我欢迎任何批评或建议。我是新手。
答案 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::Entities
:my $_html_entities_p = eval 'require HTML::Entities';
。如果配置选项decode_entities
设置为真值,并且可以加载HTML::Entities
,则实体将在剥离数据中解码。
示例:给出输入
<code> $x < $y </code>
然后剥离会产生
$x < $y
解码实体会使它
$x < $y