0

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

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

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

我已经尝试深入研究 Html::Strip 的内容(为了根据我的需要对其进行修改),但我无法理解以下代码的作用:

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

似乎 strip_html 是一个子,但我在任何地方都找不到那个子。

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


... 第二天...

在与@amon 反复讨论之后,我想出了一个我认为足以满足我的目的的解决方案。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,并确保没有单词与“<”或“>”或非空格空白字符相冲突。

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 的帮助,我欢迎任何批评或建议。我是新手。

4

1 回答 1

0

该模块HTML::Strip使用 XS 胶水语言将 Perl 代码与 C 代码连接起来。您可以在 (meta-)cpan 上找到XS 文件。它包括一个实现实际算法的文件strip_html.c 。由于 XS 文件中的定义,strip_htmlPerl 代码中提供了一个 sub 作为HTML::Strip包的一部分。因此,它可以作为适当对象的方法调用。

那段代码的解释

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

这将在 的内容上调用 C 函数$text以去除所有 HTML 标记。然后将剥离的数据分配给$stripped.

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

给变量名加上后缀-p是一种口齿不清的传统,用来表示布尔变量(或数学中的谓词)。在这里,它指示是否HTML::Entities可以加载:my $_html_entities_p = eval 'require HTML::Entities';. 如果配置选项decode_entities设置为真值,并且HTML::Entities可以加载,那么实体将在剥离数据中被解码。

示例:给定输入

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

然后剥离会产生

$x &lt; $y

和解码实体将使它

$x < $y
于 2013-06-27T22:48:17.243 回答