gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:24:35 24 4
gpt4 key购买 nike

如果 id,我需要找到该值所有 <div> 的属性具有 <span> 的元素 child 。

例如,给定这个 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>

最佳答案

不幸的是Mojo::DOM不支持 XPath 表达式以及 CSS,因为它是前者中非常自然的表达式。

您可能需要考虑切换到 HTML::TreeBuilder::XPath .代码看起来像这样。它使用 XPath 表达式

//div[*][local-name(*[1])="span"]/@id

要求 id任何 div 的属性文档中至少有一个子元素且第一个子元素的本地名称为 span 的元素.
use strict;
use warnings;
use 5.014;

use HTML::TreeBuilder::XPath;

my $tree = do {
local $/;
HTML::TreeBuilder::XPath->new_from_content(<DATA>);
};

say for $tree->findvalues('//div[*][local-name(*[1])="span"]/@id');

__DATA__
<html><body>
<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>
</body></html>

输出
a1

关于perl - 按第一个子元素的名称选择 HTML 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25917115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com