-7

我正在尝试使用正则表达式解析多行 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*(space) 用于多行,但它不起作用。我搜索了它,甚至用于/\?多线,但这也不起作用。

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

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

4

3 回答 3

12

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

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

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

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

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

于 2012-11-06T10:53:39.513 回答
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;
于 2012-12-06T10:48:00.903 回答
-3

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

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

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

于 2012-11-06T11:25:40.020 回答