【问题标题】:Parse html nested list to perl array将 html 嵌套列表解析为 perl 数组
【发布时间】:2013-11-12 19:25:02
【问题描述】:

输入数据:(一些带有链接的嵌套列表)

<ul>
    <li><a>1</a>
        <ul>
            <li><a>11</a>
                <ul>
                    <li><a>111</a></li>
                    <li><a>112</a></li>
                    <li><a>113</a>
                    <ul>
                        <li><a>1131</a></li>
                        <li><a>1132</a></li>
                        <li><a>1133</a></li>
                    </ul></li>
                    <li><a>114</a></li>
                    <li><a>115</a></li>
                </ul>
            </li>
            <li><a>12</a>
                <ul>
                    <li><a>121</a>
                    <ul>
                        <li><a>1211</a></li>
                        <li><a>1212</a></li>
                        <li><a>1213</a></li>
                    </ul></li>
                    <li><a>122</a></li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

输出字符串数组:

 1,11,111
 1,11,112
 1,11,113,1131
 1,11,113,1132
 1,11,113,1133
 1,11,114
 1,11,115
 1,12,121,1211
 1,12,121,1212
 1,12,121,1213
 1,12,122

包含元素文本的完整路径

  • 没有孩子。

    我尝试了什么: 1. XML::SAX::ParserFactory

    https://gist.github.com/7266638 这里有很多问题。如何检测 li 是否持续,如何保存路径等。我认为这是不好的方式。

    1. 它完全不是一个正则表达式,因为现实生活中的例子 html 更糟糕。很多标签、div、span等

    多姆?但是怎么做呢?

  • 【问题讨论】:

    • 我不明白为什么113111321133 在树中处于同一级别时会出现在113 之后。
    • 是的!谢谢!我放置了错误的标签 /li

    标签: perl xml-parsing html-parsing


    【解决方案1】:

    您可以尝试使用XML::Twig 模块。它保存来自&lt;a&gt; 元素的所有文本,并且仅在&lt;li&gt; 元素之一下没有子&lt;ul&gt; 时打印它们。

    #!/usr/bin/env perl
    
    use warnings;
    use strict;
    use XML::Twig;
    
    my (@li);
    
    my $twig = XML::Twig->new(
            twig_handlers => {
                    'a' => sub {
                            if ( $_->prev_elt('li') ) { 
                                    push @li, $_->text;
                            }   
                    },  
                    'li' => sub {
                            unless ( $_->children('ul') ) { 
                                    printf qq|%s\n|, join q|,|, @li;
                            }   
                            pop @li;
                    },  
            },  
    )->parsefile( shift );
    

    像这样运行它:

    perl script.pl xmlfile
    

    产生:

    1,11,111
    1,11,112
    1,11,113,1131
    1,11,113,1132
    1,11,113,1133
    1,11,114
    1,11,115
    1,12,121,1211
    1,12,121,1212
    1,12,121,1213
    1,12,122
    

    【讨论】:

    • 谢谢!这很棒。 XML::Twig - 对我来说也很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 2021-12-24
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多