【问题标题】:Using Mojo::DOM to extract untagged text after heading使用 Mojo::DOM 提取标题后未标记的文本
【发布时间】:2019-08-07 20:39:59
【问题描述】:

我正在尝试使用 Mojo::DOM 从 HTML 文件中提取一些没有标签的文本(我是新手)。特别是H2标题后的描述文字(文件中还有其他标题)。

<h2>Description</h2>This text is the description<div class="footer">[<a href="/contrib/rev/1597/2795/">Edit description</a>

我已经能够找到标题,但不知道如何访问后面的文本,因为我没有标签可以跳转到...

my $dom = Mojo::DOM->new( $htmlfile );
my $desc = $dom
    ->find('h2')
    ->grep(sub { $_->all_text =~ /Description/ })
    ->first;

谁能向我推荐一种获取“This text is the description”字符串的方法?

【问题讨论】:

  • 您能否发布更多 HTML,例如父元素。

标签: perl mojo-dom


【解决方案1】:

可以遍历所有节点,也可以捕获那些不在HTML元素(标签)内的节点。然后使用您需要h2 标记之后的节点这一事实。

更准确地说,它跟随作为(可识别的)h2 标签节点的子节点的文本节点。

use warnings;
use strict;
use feature 'say';

use Mojo::DOM;

my $html = q(<h2>Description</h2> This text is the description <p>More...</p>);

my $dom = Mojo::DOM->new($html);

my $is_next = 0;

foreach my $node ($dom->descendant_nodes->each) { 
    my $par = $node->parent;
    if ($node->type eq 'text' and $par->type eq 'tag' and $par->tag eq 'h2') { 
        $is_next = 1;
    }   
    elsif ($is_next) {
        say $node;       #-->   This text is the description
        $is_next = 0;
    }   
}

通过询问前一个文本节点(h2 标签的文本)或其父节点(标签)。

也应该检查节点本身,例如查看它是否确实只是松散的文本而不是实际上的下一个标签。

我已经用更复杂的 HTML 进行了测试;以上是几乎最小的可测试标记。


在这个简单的例子中,$dom-&gt;text 捕获了所需的文本。但是,在搜索文本不在第一个元素之后的更复杂的片段中,情况并非如此。

【讨论】:

    【解决方案2】:

    试试这段代码,我刚刚添加了一个父元素:

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    use Mojo::DOM;
    
    
    my $html = q{<div class="container"><h2>Description</h2>This text is the description<div class="footer">[<a href="/contrib/rev/1597/2795/">Edit description</a>
    </div></div>};
    
    my $dom = Mojo::DOM->new($html);
    
    print $dom->at('div.container')->text();
    

    或者,使用您的 HTML sn-p,可以完成以下操作:

    print $dom->text();
    

    【讨论】:

      猜你喜欢
      • 2016-01-29
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多