【发布时间】:2013-06-25 14:40:26
【问题描述】:
我正在使用 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 反复讨论之后,我想出了一个我认为足以满足我的目的的解决方案。 amon 把我推向了正确的方向,尽管他建议我不要做我已经做过的事情,哈哈。
这是一种野蛮的方法,但可以令人满意地完成工作。将其留在这里,以防其他人有与我相同的愿望并且不介意快速而肮脏的解决方案:
my $input = text.html;
my $stripped = $hs->parse($input);
$hs->eof;
所以现在我有两个字符串变量。一个是我要操作的html文件,另一个是同一个去掉html的文件。
my @marks = split(/\s/, $stripped);
@marks = uniq(@marks);
现在我有一个列表,列出了我的文件中出现的所有与 HTML 标记无关的单词。
$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,并确保没有单词与“”或非空格空白字符相匹配。
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 的事实。有一些方法可以解决这个问题,但我再次没有空间或时间在这里讨论这个问题。
感谢 amon 的帮助,我欢迎任何批评或建议。我是新手。
【问题讨论】: