Html 需要帮助在perl中形成正则表达式吗

Html 需要帮助在perl中形成正则表达式吗,html,regex,perl,Html,Regex,Perl,我需要一些解析html内容的建议,需要提取div中标记的id,并将其存储到特定于变量的变量中。我已经尝试为此创建一个正则表达式,但它在所有div中获取tag的id。我需要存储tag的id,它只在特定div中 HTML内容是 <div class="m_categories" id="part_one"> <ul> <li>- <a href="#" class="sel_cat " id="sel_cat_10018">aaa</a>

我需要一些解析html内容的建议,需要提取div中标记的id,并将其存储到特定于变量的变量中。我已经尝试为此创建一个正则表达式,但它在所有div中获取tag的id。我需要存储tag的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>

  • -
  • -
  • . . .
    • -
    • -
    • -
    • . .
需要一些建议,提前谢谢

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


如果($content=~m/sel_cat“id=”([^你应该仔细研究,而不是试图使用正则表达式来提取一些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);

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

您应该仔细研究,而不是尝试使用正则表达式来提取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);

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

有很多很棒的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
sel_cat_10018
sel_cat_10007
sel_cat_10016
sel_cat_10011
sel_cat_10025
或对于ID:

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

aaa
bbb
ccc
ddd
eee
sel_cat_10018
sel_cat_10007
sel_cat_10016
sel_cat_10011
sel_cat_10025

如果您只想在
part_two
div中使用这些ID,请使用选择器
part_two a.sel_cat

有很多很棒的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
sel_cat_10018
sel_cat_10007
sel_cat_10016
sel_cat_10011
sel_cat_10025
或对于ID:

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

aaa
bbb
ccc
ddd
eee
sel_cat_10018
sel_cat_10007
sel_cat_10016
sel_cat_10011
sel_cat_10025

如果您只想在
part_two
div中使用这些ID,那么使用选择器
part_two a.sel_cat

我认为一个合适的html解析器会更容易。如果您仍然想使用regex…发布您一直在尝试的regex。必须:。“即使是Jon Skeet也无法使用正则表达式解析HTML。每次你尝试使用正则表达式解析HTML时,邪恶的孩子都会为处女流下鲜血,俄罗斯黑客会攻击你的Web应用程序。“我认为,一个合适的HTML解析器会更容易。如果你仍然想使用正则表达式…发布你一直在尝试的正则表达式。必须:。”即使Jon Skeet也无法使用正则表达式解析HTML。每次你尝试使用正则表达式解析HTML时,邪恶的孩子都会为处女流下鲜血,俄罗斯黑客会攻击你的Web应用程序。“谢谢@Amon,但我面临一个错误
无法通过包“Mojo::Collection”找到对象方法“all_text”“
但我已经安装了该软件包。如何解决此问题issue@Balakumar给你。有一个愚蠢的输入错误(car而不是cat),导致查询返回一个空集合。我纠正了这个错误,还添加了一些没有空结果问题的版本。非常感谢你,阿蒙:)谢谢@Amon,但我面临一个错误
无法通过包“Mojo::Collection”找到对象方法“all_text”
,但我已经安装了该包。我如何解决这个问题issue@Balakumar给你。有一个愚蠢的打字错误(车而不是猫),该查询返回了一个空集合。我更正了这一点,还添加了与空结果没有问题的版本。非常感谢,Amon:)