正则表达式解析多行HTML

时间:2012-11-06 10:49:11

标签: html regex perl html-parsing multiline

我正在尝试使用正则表达式解析多行html文件。

HTML code:

<td>Details</td></tr>  
<tr class=d1>
<td>uss_vod_translator</td>

正则表达式:

if ($line =~ m/Details<\/td>\s*<\/tr>\s*<tr\s*class=d1>\s*<td>(\w*)<\/td>/)
{
    print "$1";
}

我使用/s*(空格)来表示多行,但它不起作用。我搜索过它,甚至使用/\?来表示多行,但这也没有用。

任何人都可以建议我如何解析多行HTML吗?

我知道正则表达式是一种解析HTML的糟糕解决方案。但我有一个遗留的HTML代码,我需要解析,别无选择。

3 个答案:

答案 0 :(得分:12)

  

任何人都可以建议我如何解析多行HTML吗?

停止尝试使用正则表达式并使用将为您解析它的模块。

HTML::TreeBuilder是一个很好的解决方案。

HTML::TreeBuilder::LibXML为您提供相同的API,但由快速解析器支持。

HTML::TreeBuilder::XPath添加了XPath支持以及快速解析器。

答案 1 :(得分:0)

如上所述永远不要使用正则表达式来解析HTML

我正在使用HTML :: TreeBuilder :: XPath来解析HTML,这个戏剧性地减少了我的每个抓取/解析程序的创建时间。

以下是您的任务实施方式:

use Modern::Perl;
use HTML::TreeBuilder::XPath;

my $html = <<END;
<tr><td>General Info</td></tr>  
<tr class=d1>
<td>some info</td></tr>
<tr><td>Details</td></tr>  
<tr class=d1>
<td>uss_vod_translator</td></tr>
<tr><td>Another header</td></tr>  
<tr class=d1>
<td>some other info</td></tr>
END

my $tree = HTML::TreeBuilder::XPath->new_from_content($html);

my ($details) = $tree->findvalues('//tr[ td[ text() = "Details" ] ]/following-sibling::tr[1]/td[1]');
say $details;

答案 2 :(得分:-3)

在匹配模式之前尝试以下行

 $line=~s/>(\n|\t|\s)+</></gs;

然后您可以将HTML字符串设置为单行。