0

我在解析 html 内容时需要一些建议,需要在 div 中提取标签 <\a> 的 id,并将其存储到变量特定的变量中。我试图为此制作一个正则表达式,但它在所有 div 中获取标签的 id。我需要存储仅在特定 div 内的 tag<\a> 的 ID。

HTML 内容是

<div class="m_categories" id="part_one">
<ul>
<li>-
<a href="#" class="sel_cat " id="sel_cat_10018">aaa</a>
</li>
<li>-
<a href="#" class="sel_cat " id="sel_cat_10007">bbb</a>
</li>
.
.
.
</div>

<div class="m_categories hidden" id="part_two">
<ul>
<li>-
<a href="#" class="sel_cat " id="sel_cat_10016">ccc</a>
</li>
<li>-
<a href="#" class="sel_cat " id="sel_cat_10011">ddd</a>
</li>
<li>-
<a href="#" class="sel_cat " id="sel_cat_10025">eee</a>
</li>
.
.
</div>

需要一些建议,提前谢谢

更新: 我用过的正则表达式

if($content=~m/sel_cat " id="([^<]*?)"/is){}

while($content=~m/sel_cat " id="([^<]*?)"/igs){}

4

2 回答 2

2

您应该真正研究HTML::Parser而不是尝试使用正则表达式来提取 HTML 位。

我们从每个 div 标签中提取 id 元素的一种方法是:

# This parser only looks at opening tags
sub start_handler { 
my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
if ($tagname eq 'div') { # is it a div element?
        if($attr->{ id }) {  # does div have an id?
            print "div id found: ", $attr->{ id }, "\n";
        }       
}
}
my $html = &read_html_somehow() or die $!;

my $p = HTML::Parser->new(api_version => 3);
$p->handler( start => \&start_handler );
$p->parse($html);

这比基于正则表达式的方法更加健壮和灵活。

于 2013-08-30T19:19:41.410 回答
1

周围有很多很棒的 HTML 解析器。我有点喜欢 Mojo 套件,它允许我使用 CSS 选择器来获取 DOM 的一部分:

use Mojo;

my $dom = Mojo::DOM->new($html_content);

say for $dom->find('a.sel_cat')->all_text;
# Or, more robust:
# say $_->all_text for $dom->find('a.sel_cat')->each;

输出:

aaa
bbb
ccc
ddd
eee

或者对于 ID:

say for $dom->find('a.sel_cat')->attr('id');
# Or, more robust_
# say $_->attr('id') for $dom->find('a.sel_cat')->each;

输出:

sel_cat_10018
sel_cat_10007
sel_cat_10016
sel_cat_10011
sel_cat_10025

如果您只想在part_twodiv 中使用这些 id,请使用 selector #part_two a.sel_cat

于 2013-08-30T19:39:26.280 回答