如何使用简单的perl脚本选择特定的html标记元素及其内容

时间:2013-11-14 13:11:12

标签: html regex perl

输入

此元素的一些内容< span class =“t39”> abcd< / span> 此元素周围的一些内容

Hello world < span class =“t39”> efgh< / span> 此元素周围的一些内容

围绕此元素的一些内容< span class =“t39”> ijk< / span> 围绕此元素的一些内容

输出:

此元素的一些内容< span class =“t39”>αβγδ< / span> 围绕这个要素的一些内容

Hello world &lt; span class =“t39”&gt;&amp;#949;&amp;#966;&amp;#978;&amp;#951;&lt; / span&gt; 此元素周围的一些内容<登记/>
围绕此元素的一些内容&lt; span class =“t39”&gt;&amp;#953;&amp;#962;&amp;#954;&amp;#955;&lt; / span&gt; 一些内容这个要素

实体转换只需要来处理html元素

中的内容

我是perl编程的初学者。善意地指导这个问题。

3 个答案:

答案 0 :(得分:0)

使用xshXML::LibXML的包装器,也可以处理html。

open :F html 1.html ;
for //span[@class="t39"] {
    my $t = text();
    $t = { join q(), map chr(848 + ord), split //, $t } ;
    set . $t ;
}
save :b ;

输出略有不同:它使用实体的十六进制代码:

<html>
<body>Some content around this element <span class="t39">&#x3B1;&#x3B2;&#x3B3;&#x3B4;</span> Some content around this element

Hello world <span class="t39">&#x3B5;&#x3B6;&#x3B7;&#x3B8;</span> Some content around this element

Some content around this element <span class="t39">&#x3B9;&#x3BA;&#x3BB;</span> Some content around this element
</body>
</html>

答案 1 :(得分:0)

嗯,你可以说,你想在“&gt;”之间编码。和'&lt;' (关闭和打开HTML括号 - 或者不管它们叫什么:))。在这种情况下,您可以使用正则表达式,如下所示:

sub do_something {
    my $string = shift;
    return $string." perl is awesome";
}
my $text = "some text <span blabla>my text</span>other text";
$text =~ s/>(.*)</">".do_something($1)."<"/e

使用=〜,您可以将“正则表达式”应用于变量。我在这里使用的形式是s / search_this / replace_it_for_this / e。 s /意味着替代。 &GT;&LT(*);意味着找到字符'&gt;'之间的任何内容和'&lt;'。 (更多内容:http://perldoc.perl.org/perlrequick.html)。

/ e开关允许您在正则表达式中执行perl函数。在正则表达式的'replace_for_this'部分,我们有“&gt;”。do_something($ 1)。“&lt;” 。它将用字符&gt;替换我们找到的字符串。然后是do_something函数的返回值,后跟字符&lt;。 do_something函数的参数中的$ 1是我们在正则表达式的“search_this”部分中找到的字符串(由于parenteses而被保存到$ 1。

对于实际的编码..你需要编码所有的字符,或只是一些特殊的字符?在后一种情况下,我建议你看一下这个模块:http://metacpan.org/pod/HTML::Entities。就是这样。

答案 2 :(得分:0)

正如所说,使用perl库更好,因为正则表达式解析平衡文本非常糟糕

有用的库

HTML :: Parser完整,但对初学者来说并不容易。

HTML :: TokeParser :: Simple对于初学者来说非常简单

如果你喜欢一些有趣的正则表达式,你也可以使用下面的代码

my (@res) = grep { !/span/i  } $str =~ m/<(span)[^>]*> #memorize span and find attributes 
                                          (.+?)       #minimum search
                                         <\/\1>       #\1 is for span memorized
                                         /gmixs;

grep delete first memorized search =&gt;跨度

整个搜索结果都是数组中的。

如果您的标签是嵌套的,则无法使用。正则表达式不起作用。

样品: &LT; DIV&GT;&LT; DIV&GT; texte&LT; / DIV&GT;&LT; / DIV&GT;