我正在尝试使用正则表达式解析多行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代码,我需要解析,别无选择。
答案 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字符串设置为单行。