【问题标题】:Mojo::DOM manipulationMojo::DOM 操作
【发布时间】:2017-09-04 15:39:23
【问题描述】:

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

 <div>
   <p>1<div>D</div></p>

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

检查children 方法,但它也返回所有降序节点,而我想获得第一级&lt;p&gt; 节点。

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 mojolicious


    【解决方案1】:

    你可能想要:

    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>
    

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

    【讨论】:

    • -&gt;at('div')-&gt;children('p')
    • @Borodin 是的,这更好,因为我的find 也会找到嵌套更深的ps。
    • 我就是这么想的。但是 OP 不想告诉我们有关他们的问题的任何有用信息,因此很难说出需要什么。我想知道他们是否真的试图处理格式错误的 HTML 或其他东西。这真是一个糟糕的问题。
    【解决方案2】:

    检查了children方法,但它也返回所有降序节点

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

    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>
    

    但您不需要它来删除 &lt;body&gt; 元素的第一个子 &lt;p&gt; 元素。应该是这样的

    $dom->at('body > p')->remove
    

    要删除&lt;div&gt;第二个 &lt;p&gt; 子级,如下所示

    $dom->find('div > p')->[1]->remove
    

    &lt;div&gt; 元素确实需要更好的规范

    【讨论】:

      猜你喜欢
      • 2011-10-06
      • 1970-01-01
      • 2015-06-25
      • 2012-10-28
      • 2012-09-30
      • 2013-06-30
      • 1970-01-01
      • 2022-11-23
      • 2011-02-19
      相关资源
      最近更新 更多