我想删除第二个<p>
节点及其内容:
<div>
<p>1<div>D</div></p>
<p>2</p>
</div>
检查children方法,但它也返回所有降序节点,而我想获得第一级<p>
节点。
perl -Mojo -E'
say for @{ x("
<div>
<p>1<div>D</div></p>
<p>2</p>
</div>
")->at("div")->children }
'
输出
<p>1</p>
<div>D</div>
<p>2</p>
答案 0 :(得分:3)
你可能想要:
perl -Mojo -E'
say for @{ x("
<div>
<p>1<div>D</div></p>
<p>2</p>
</div>
")->find("div > p")}
'
输出
<p>1</p>
<p>2</p>
但我不确定这是你想要的......
答案 1 :(得分:2)
检查
children
方法,但它也返回所有降序节点
您展示的示例会尝试解析无效的HTML,该段在<div>
段落中包含非法的<p>
元素。解析器通过将结束</p>
移动到开始<div>
之前来解决这个问题,这正是真正的浏览器所做的。因此,对children
的调用正确地找到了顶级<div>
的所有三个孩子,而不是所有后代的推测
use strict;
use warnings 'all';
use feature 'say';
use Mojo::DOM;
say Mojo::DOM->new(<<END)->at('div');
<div>
<p>1<div>D</div></p>
<p>2</p>
</div>
END
<div>
<p>1</p><div>D</div>
<p>2</p>
</div>
但是您不需要删除<p>
元素的第一个子<body>
元素。这看起来像这样
$dom->at('body > p')->remove
要删除<p>
的第二个 <div>
子项,将会是这样的
$dom->find('div > p')->[1]->remove
但<div>
元素确实需要更好的规范