我试图从一个恶劣的数据站点获取一些数据 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的新手,希望有人可以提供帮助。 谢谢!!!
答案 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 Index
和Draw
列。
您可以使用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