Mojo::DOM 操纵
Mojo::DOM manipulation
我想从以下位置删除第二个 <p>
节点及其内容:
<div>
<p>1<div>D</div></p>
<p>2</p>
</div>
检查了 children 方法,但它也 returns 所有下降节点,而我想获得第一级 <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>
你可能想要:
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>
但我不确定这是不是你想要的..
Checked children
method, but it also returns all descending nodes
您显示的示例尝试解析无效的 HTML,它在 <p>
段落中包含非法的 <div>
元素。解析器通过将结束 </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>
但是您不需要它来删除 <body>
元素的第一个子 <p>
元素。看起来像这样
$dom->at('body > p')->remove
要删除 <div>
的 second <p>
子项,将如下所示
$dom->find('div > p')->[1]->remove
但是 <div>
元素确实需要更好的规范
我想从以下位置删除第二个 <p>
节点及其内容:
<div>
<p>1<div>D</div></p>
<p>2</p>
</div>
检查了 children 方法,但它也 returns 所有下降节点,而我想获得第一级 <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>
你可能想要:
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>
但我不确定这是不是你想要的..
Checked
children
method, but it also returns all descending nodes
您显示的示例尝试解析无效的 HTML,它在 <p>
段落中包含非法的 <div>
元素。解析器通过将结束 </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>
但是您不需要它来删除 <body>
元素的第一个子 <p>
元素。看起来像这样
$dom->at('body > p')->remove
要删除 <div>
的 second <p>
子项,将如下所示
$dom->find('div > p')->[1]->remove
但是 <div>
元素确实需要更好的规范