将 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等
多姆?但是怎么做呢?
【问题讨论】:
我不明白为什么1131
、1132
和1133
在树中处于同一级别时会出现在113
之后。
是的!谢谢!我放置了错误的标签 /li
【参考方案1】:
您可以尝试使用XML::Twig
模块。它保存来自<a>
元素的所有文本,并且仅在<li>
元素之一下没有子<ul>
时打印它们。
#!/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 数组的主要内容,如果未能解决你的问题,请参考以下文章