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> 元素确实需要更好的规范