【问题标题】:Regex to parse a multiline HTML正则表达式解析多行 HTML
【发布时间】:2012-11-06 10:49:10
【问题描述】:

我正在尝试使用正则表达式解析多行 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 regex perl html-parsing multiline


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    如上所述切勿使用正则表达式解析 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;
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-20
        • 2014-12-06
        • 2012-09-12
        • 2014-05-16
        • 1970-01-01
        • 2020-03-05
        相关资源
        最近更新 更多