我知道HTML:Parser是一个东西,通过阅读,我已经意识到尝试使用正则表达式解析html通常是一种次优的处理方式,但是对于Perl类我目前正试图使用常规表达式(希望只是一个匹配)来识别和存储保存的html文档中的句子。最终,我希望能够计算句子数量,单词/句子以及希望页面上单词的平均长度。
目前,我刚试图隔离“>”之后的内容并且在“。”之前只是为了看看它是否隔离了什么,但是即使在操作正则表达式时我也无法运行代码。所以我不确定问题是在正则表达式,其他地方还是两者都有。任何帮助将不胜感激!
#!/usr/bin/perl
#new
use CGI qw(:standard);
print header;
open FILE, "< sample.html ";
$html = join('', <FILE>);
close FILE;
print "<pre>";
###Main Program###
&sentences;
###sentence identifier sub###
sub sentences {
@sentences;
while ($html =~ />[^<]\. /gis) {
push @sentences, $1;
}
#for debugging, comment out when running
print join("\n",@sentences);
}
print "</pre>";
答案 0 :(得分:3)
你的正则表达式应该是/>[^<]*?./gis
*?
表示匹配零或更多非贪婪。如上所述,你的正则表达式只匹配一个非&lt;字符后跟一个句号和一个空格。这样它将匹配所有非&lt;直到第一个时期。
可能还有其他问题。
现在阅读this
答案 1 :(得分:2)
第一个改进是写$html =~ />([^<.]+)\. /gs
,你需要捕捉与父母的匹配,并允许每个句子超过1个字母; - )
这并不能得到所有句子,只是每个元素中的第一个句子。
更好的方法是捕获所有文本,然后从每个片段中提取句子
while( $html=~ m{>([^<]*<}g) { push @text_content, $1};
foreach (@text_content) { while( m{([^.]*)\.}gs) { push @sentences, $1; } }
(未经测试,因为它是在清晨,咖啡正在呼唤)
关于使用regexps解析HTML的所有常见注意事项都适用,最值得注意的是“&gt;”的存在在文中。
答案 2 :(得分:0)
我认为这或多或少会影响您的需求。请记住,此脚本仅查看p标记内的文本。文件名作为命令行参数(shift)传入。
#!/usr/bin/perl
use strict;
use warnings;
use HTML::Grabber;
my $file_location = shift;
print "\n\nfile: $file_location";
my $totalWordCount = 0;
my $sentenceCount = 0;
my $wordsInSentenceCount = 0;
my $averageWordsPerSentence = 0;
my $char_count = 0;
my $contents;
my $rounded;
my $rounded2;
open ( my $file, '<', $file_location ) or die "cannot open < file: $!";
while( my $line = <$file>){
$contents .= $line;
}
close( $file );
my $dom = HTML::Grabber->new( html => $contents );
$dom->find('p')->each( sub{
my $p_tag = $_->text;
++$totalWordCount while $p_tag =~ /\S+/g;
while ($p_tag =~ /[.!?]+/g){
$p_tag =~ s/\s//g;
$char_count += (length($p_tag));
$sentenceCount++;
}
});
print "\n Total Words: $totalWordCount\n";
print " Total Sentences: $sentenceCount\n";
$rounded = $totalWordCount / $sentenceCount;
print " Average words per sentence: $rounded.\n\n";
print " Total Characters: $char_count.\n";
my $averageCharsPerWord = $char_count / $totalWordCount ;
$rounded2 = sprintf("%.2f", $averageCharsPerWord );
print " Average words per sentence: $rounded2.\n\n";