正则表达式解析HTML的句子?

时间:2013-05-22 06:08:43

标签: html regex perl parsing

我知道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>";

3 个答案:

答案 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";