将 html 嵌套列表解析为 perl 数组

Posted

技术标签:

【中文标题】将 html 嵌套列表解析为 perl 数组【英文标题】:Parse html nested list to perl array 【发布时间】: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 是否持续,如何保存路径等。我认为这是不好的方式。

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

多姆?但是怎么做呢?

【问题讨论】:

我不明白为什么113111321133 在树中处于同一级别时会出现在113 之后。 是的!谢谢!我放置了错误的标签 /li 【参考方案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 - 对我来说也很好。

以上是关于将 html 嵌套列表解析为 perl 数组的主要内容,如果未能解决你的问题,请参考以下文章

flutter : 嵌套的 json 解析列表

请问怎么给perl里的标量,哈希,数组赋初值?

将嵌套键解压缩到列表中[重复]

如何使用 Jersey 将嵌套列表编组为 JSON?我得到一个空数组或一个包含数组的单元素字典数组

Azure 数据流:从 JSON 字符串解析对象的嵌套列表

将对象的嵌套数组列表从适配器传递到活动