我在解析html内容时需要一些建议,需要提取标签的ID< \ a>在div中,并将其存储到变量特定变量中。我试图为此制作一个正则表达式,但它在所有div中得到了tag的id。我需要存储标签< \ a>的ID这只是在一个特定的div内。
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 =”([^&lt;] *?)“/ is){}
while($ content = ~m / sel_cat“id =”([^&lt;] *?)“/ igs){}
答案 0 :(得分: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);
这比基于正则表达式的方法更加强大和灵活。
答案 1 :(得分: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_two
div中使用这些ID,请使用选择器#part_two a.sel_cat
。