Mojo :: DOM操作

时间:2017-04-09 16:00:18

标签: perl mojolicious

我想删除第二个<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>

2 个答案:

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