如何从此HTML表中提取日期?

时间:2012-03-08 18:28:07

标签: regex perl

我正在尝试使用正则表达式从表格中的第二个单元格获取“日期”, 但它不匹配,我真的找不到原因。

my $str = '"    
    <td class="fieldLabel" height="18">Activation Date:</td>
    <td class="dataEntry" height="18">
        10/27/2011      
    </td>';

if ( $str =~ /Activation Date.*<td.*>(.*)</gm ) {
    print "matched: ".$1;
}else{
    print "mismatched!";
}

2 个答案:

答案 0 :(得分:4)

其他人已经指出,您希望/s选项使.与换行符匹配,以便您可以使用.*跨越逻辑行边界。您可能还需要非贪婪的.*?

use v5.10;

my $html = <<'HTML';    
    <td class="fieldLabel" height="18">Activation Date:</td>
    <td class="dataEntry" height="18">
        10/27/2011      
    </td>
HTML

my $regex = qr|
    <td.*?>Activation \s+ Date:</td>
        \s*
    <td.*?class="dataEntry".*?>\s*
        (\S+)
    \s*</td>
    |xs;

if ( $html =~ $regex ) {
    say "matched: $1";
    }
else {
    say "mismatched!";
    }

如果你有完整的表,那么使用知道如何解析表的东西会更容易。让诸如There之类的模块HTML::TableParser处理所有细节:

use v5.10;

my $html = <<'HTML';
    <table>
    <tr>
    <td class="fieldLabel" height="18">Activation Date:</td>
    <td class="dataEntry" height="18">
        10/27/2011      
    </td>
    </tr>
    </table>
HTML

use HTML::TableParser;

sub row {
    my( $tbl_id, $line_no, $data, $udata ) = @_;
    return unless $data->[0] eq 'Activation Date';
    say "Date is $data->[1]";
    }

# create parser object
my $p = HTML::TableParser->new( 
    { id => 1, row => \&row, } 
    { Decode => 1, Trim => 1, Chomp => 1, } 
    );
$p->parse( $html );

还有HTML::TableExtract

use v5.10;

my $html = <<'HTML';
    <table>
    <tr>
    <td class="fieldLabel" height="18">Activation Date:</td>
    <td class="dataEntry" height="18">
        10/27/2011      
    </td>
    </tr>
    </table>
HTML

use HTML::TableExtract;

my $p = HTML::TableExtract->new;
$p->parse( $html );
my $table_tree = $p->first_table_found;
my $date = $table_tree->cell( 0, 1 );
$date =~ s/\A\s+|\s+\z//g;
say "Date is $date";

答案 1 :(得分:3)

你可能误解了正则表达式标志。

  • /m表示您可能会尝试匹配多行,方法是确保^可以表示行的开头而$可能意味着行的结束。
  • /s表示您希望通过允许.表示任何字符(包括换行符)来将多行表达式视为单行表达式。通常,.表示除换行符之外的任何字符

如果你添加了/s标记,那么你的正则表达式应该可行,you really shouldn't parse HTML with regex anyway