我想从以下位置删除第二个<p>节点及其内容:
<div>
<p>1<div>D</div></p>
<p>2</p>
</div>选中了孩子们方法,但它也返回所有降序节点,而我希望获得第一级<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>发布于 2017-04-09 18:04:46
你可能想:
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>但我不确定这是不是你想要的..。
发布于 2017-04-09 18:46:50
选中
children方法,但它也返回所有降序节点。
您展示的示例试图解析无效的HTML,它在<p>段落中有一个非法的<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>元素确实需要一个更好的规范
https://stackoverflow.com/questions/43308854
复制相似问题