首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mojo::DOM操作

Mojo::DOM操作
EN

Stack Overflow用户
提问于 2017-04-09 16:00:17
回答 2查看 230关注 0票数 0

我想从以下位置删除第二个<p>节点及其内容:

代码语言:javascript
复制
 <div>
   <p>1<div>D</div></p>

   <p>2</p>
 </div>

选中了孩子们方法,但它也返回所有降序节点,而我希望获得第一级<p>节点。

代码语言:javascript
复制
perl -Mojo -E'
say for @{ x("
    <div>
    <p>1<div>D</div></p>

    <p>2</p>
    </div>
  ")->at("div")->children }
'

输出

代码语言:javascript
复制
<p>1</p>
<div>D</div>
<p>2</p>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-09 18:04:46

你可能想:

代码语言:javascript
复制
perl -Mojo -E'
say for @{ x("
    <div>
    <p>1<div>D</div></p>

    <p>2</p>
    </div>
  ")->find("div > p")}
'

输出

代码语言:javascript
复制
<p>1</p>
<p>2</p>

但我不确定这是不是你想要的..。

票数 3
EN

Stack Overflow用户

发布于 2017-04-09 18:46:50

选中children方法,但它也返回所有降序节点。

您展示的示例试图解析无效的HTML,它在<p>段落中有一个非法的<p>元素。解析器通过将关闭的</p>移动到打开的<div>之前来解决这个问题,这几乎是真正的浏览器会做的事情。因此,对children的调用正确地找到了顶级<div>的所有三个子级,而不是您所推测的所有后代。

代码语言:javascript
复制
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

输出

代码语言:javascript
复制
<div>
  <p>1</p><div>D</div>

  <p>2</p>
</div>

但是您不需要它来删除<p>元素的第一个子元素<body>元素。会是这样的

代码语言:javascript
复制
$dom->at('body > p')->remove

要删除<p>的第二个子<div>,如下所示

代码语言:javascript
复制
$dom->find('div > p')->[1]->remove

但是<div>元素确实需要一个更好的规范

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43308854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档