【问题标题】:Perl print matched content onlyPerl 仅打印匹配的内容
【发布时间】:2013-10-03 10:51:17
【问题描述】:

我正在用 Perl 开发一个网络爬虫。它从页面中提取内容,然后进行模式匹配以检查内容的语言。 Unicode 值用于匹配内容。

有时提取的内容包含多种语言的文本。我在这里使用的模式匹配会打印所有文本,但我只想打印与模式中指定的 Unicode 值匹配的文本。

my $uu         = LWP::UserAgent->new('Mozilla 1.3');
my $extractorr = HTML::ContentExtractor->new();

# create response object to get the url
my $responsee = $uu->get($url);
my $contentss = $responsee->decoded_content();

$range = "([\x{0C00}-\x{0C7F}]+)";    # match particular language

if ($contentss =~ m/$range/) {
  $extractorr->extract($url, $contentss);
  print "$url\n";
  binmode(STDOUT, ":utf8");
  print $extractorr->as_text;
}

【问题讨论】:

    标签: regex perl unicode web-crawler


    【解决方案1】:

    最好匹配具有特定 Unicode 属性的字符,而不是尝试制定适当的字符类。

    0x0C00...0x0C7F 范围内的代码点对应于泰卢固语(一种印度语言)中的字符,您可以使用正则表达式 /\p{Telugu}/ 进行匹配。

    您可能需要的其他属性是/\p{Kannada}//\p{Malayalam}//\p{Devanagari}//\p{Tamil}/

    【讨论】:

    • 您还在使用$range 变量吗?我希望你只写if ($contentss =~ /(\p{Telugu}+)/) {...}。如果要将正则表达式放入变量中,则必须删除方括号(因为它们仅包含字符列表,并且您不能将 Unicode 属性放入其中)并使用单引号而不是双引号(否则反斜杠会被吞掉)。所以my $range = '(\p{Telugu}+)'.
    • 我没有使用 $range 变量。试过我的 $range = '(\p{Telugu}+)' 但我得到了相同的结果
    • 尝试改用\p{InTelugu}。如果这不起作用,那么您需要显示您的代码。
    • 当我这样做时它起作用了@cont = split(/\n/,$extractorr->as_text);打印“@_\n”; foreach $cont (@cont) { if($cont =~ m/\p{Telugu}/) { binmode(STDOUT, ":utf8");打印 "$cont\n"; } }