perl正则表达式,匹配空格和数字1-12

时间:2015-02-26 07:16:43

标签: html regex perl

我试图从一个恶劣的数据站点获取一些数据 http://www.hkjc.com/english/racing/horse.asp?horseno=P278

基本上我通过上面的URl并循环遍历HTML源代码的每一行并检查行是否匹配正则表达式,如果是,我抓取一些数据并将其存储在变量中

源的示例(应该在第384-386行):

<td class=htable_eng_text align=center>
2      
</td>   

我试图匹配数字“2”,但我失败了

我做了类似的事情:

if ($line =~ /\s+([1-12])\s+/) {
#if match, then stored $1 in a variable
}

这是我的问题: 不知道我是否应该在最后添加\ s + 不确定我是否可以([1-12])作为我想要在1-12的范围内抓取的数字(我也尝试(\ d || 11 || 12))但是失败了... ...

我是perl的新手,希望有人可以提供帮助。 谢谢!!!

3 个答案:

答案 0 :(得分:2)

要检查数字1-12的范围,您可以使用此正则表达式:

/\b([1-9]|1[0-2])\b/

答案 1 :(得分:1)

不要使用正则表达式来解析HTML。请参阅:RegEx match open tags except XHTML self-contained tags

您应该真的考虑使用HTML解析器。因为在您的情况下,您正在操纵表格,您可以使用HTML::TableExtract。这将使您的表变成一个友好的友好Perl数据结构,并且您的代码将不那么脆弱。

 use HTML::TableExtract;
 $te = HTML::TableExtract->new( headers => [qw(Date Price Cost)] );
 $te->parse($html_string);

 # Examine all matching tables
 foreach $ts ($te->tables) {
   print "Table (", join(',', $ts->coords), "):\n";
   foreach $row ($ts->rows) {
      print join(',', @$row), "\n";
   }
 }

答案 2 :(得分:1)

以下是使用HTML::TableExtract作为@Sobrique推荐的示例。在不知道您想要什么信息的情况下,我猜到了Race IndexDraw列。

您可以使用headers调用的HTML::TableExtract->new参数更改检索到的列,例如[ qw/ Index Dr Jockey Class Course / ],但您必须更改print循环才能显示它们

use strict;
use warnings;

use LWP::Simple 'get';
use HTML::TableExtract;

my $url = 'http://www.hkjc.com/english/racing/horse.asp?horseno=P278';
my $html = get $url;

my $extract = HTML::TableExtract->new(
    headers => [ qw/ Index Dr /],
);
$extract->parse($html);

my $table = $extract->first_table_found;

print "Race\n";
print "Index Draw\n";

for my $row ($table->rows) {
  my ($index, $dr) = @$row;

  if ( $dr ) {
    $dr =~ s/\s+//g;
    printf "%-5s %-s\n", $index, $dr;
  }
  else {
    print $index, "\n";
  }
}

<强>输出

Race
Index Draw
 14/15 Season
390   4
334   9
273   3
207   2
156   7
129   11
098   10
009   10
 13/14 Season
682   12
637   8
596   8
570   6
452   5
372   4
332   3
272   6
218   5
144   9
098   12
033   10
 12/13 Season
728   1
598   9