正则表达式来解析多行HTML

正则表达式来解析多行HTML,html,regex,perl,html-parsing,multiline,Html,Regex,Perl,Html Parsing,Multiline,我试图用正则表达式解析一个多行html文件 HTML代码: <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>/) {

我试图用正则表达式解析一个多行html文件

HTML代码:

<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代码,我需要解析它,没有其他选择

有谁能建议我如何解析多行HTML吗

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

这是一个很好的解决方案

提供相同的API,但由快速解析器支持


添加了XPath支持和快速解析器。

在匹配模式之前,请尝试下面一行

 $line=~s/>(\n|\t|\s)+</></gs;
然后您可以将HTML字符串设置为单行

如上所述,永远不要使用正则表达式来解析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;

,一般来说。根据变量名判断,您只有一行,那么如何匹配跨越多行的内容呢?最好的答案早就有人写过了: