perl – 按其第一个子元素的名称选择HTML元素

前端之家收集整理的这篇文章主要介绍了perl – 按其第一个子元素的名称选择HTML元素前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要找到所有< div>的id属性的值.具有< span>的元素儿童.

例如,给定这个HTML

<div id="a1">                 <span> xa1 </span>       </div>
<div id="a2"> <p>...</p>      <span> xa2 </span>       </div>
<div id="a3">            <p>  <span> xa3 </span> </p>  </div>
<div id="a4"> <p>...</p>                             </div>

<div id="b1"> </div>          <span> xb1 </span>
<div id="b2"> </div> <p>      <span> xb1 </span> </p>
<div id="b3"> </div> <p>.</p> <span> xb3 </span>

我需要得到:a1,仅此而已.

因为CSS选择器没有类似正向前瞻的东西,所以我需要逐步搜索HTML,但我不知道如何.

如何修改下一个源,只获得a1?

use 5.014;
use warnings;

use Mojo::DOM;

my $html = do {local $/; <DATA>};

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

for my $div ($dom->find('div')->each) {
   #say "DIV[[$div]]";
   my @spans = $div->find('div > span')->each;   #found a1 and a2 ;(
   say $div->attr('id') if (@spans == 1);
}

__DATA__
<div id="a1">                 <span> xa1 </span>       </div>
<div id="a2"> <p>...</p>      <span> xa2 </span>       </div>
<div id="a3">            <p>  <span> xa3 </span> </p>  </div>
<div id="a4"> <p>...</p>                             </div>

<div id="b1"> </div>          <span> xb1 </span>
<div id="b2"> </div> <p>      <span> xb1 </span> </p>
<div id="b3"> </div> <p>.</p> <span> xb3 </span>

<p id="p1">                <span> xp1 </span>       </p>
<p id="p2"> <p>...</p>     <span> xp2 </span>       </p>
<p id="p3">            <p> <span> xp3 </span> </p>  </p>
<p id="p4"> <p>...</p>                              </p>

解决方法

您可以使用css样式选择器和Mojo :: DOM的 parent方法以稍微迂回的方式获取您正在寻找的元素:

use strict;
use warnings;
use feature ":5.10";
use Mojo::DOM;

my $html = do{ local $/; <DATA>};

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

# searches for div elements with spans as the first child
for my $div ( $dom->find('div > span:first-child')->parent->each ) {
    say "id: " . $div->attr('id') if $div->attr('id');
}

__DATA__
<div id="a1">                 <span> xa1 </span>       </div>
<div id="a2"> <p>...</p>      <span> xa2 </span>       </div>
<div id="a3">            <p>  <span> xa3 </span> </p>  </div>
<div id="a4"> <p>...</p>                             </div>

<div id="b1"> </div>          <span> xb1 </span>
<div id="b2"> </div> <p>      <span> xb1 </span> </p>
<div id="b3"> </div> <p>.</p> <span> xb3 </span>

<p id="p1">                <span> xp1 </span>       </p>
<p id="p2"> <p>...</p>     <span> xp2 </span>       </p>
<p id="p3">            <p> <span> xp3 </span> </p>  </p>
<p id="p4"> <p>...</p>                              </p>

输出

id: a1

或者,如果您知道它只是您想要的第一个这样的div,那么以下内容将起作用:

say "id: " . $dom->at('div > span:first-child')->parent->attr('id');

猜你在找的Perl相关文章