【问题标题】:Parsing HTML with Mojolicious User Agent使用 Mojolicious 用户代理解析 HTML
【发布时间】:2012-12-10 21:48:38
【问题描述】:

我有类似这样的html

 <h1>My heading</h1>

 <p class="class1">
 <strong>SOMETHING</strong> INTERESTING (maybe not).
 </p>

 <div class="mydiv">
 <p class="class2">
 <a href="http://www.link.com">interesting link</a> </p>

 <h2>Some other heading</h2>

h1 和 h2 之间的内容有所不同——我知道我可以在 Mojo::Dom 中使用 css 选择器来选择 h1 或 h2 的内容,或者 p 标签——但是如何选择 h1 和 h2 之间的所有内容?或者更一般地说,任意两组给定标签之间的所有内容?

【问题讨论】:

  • 存在 XML 解析器。使用它们。
  • @JackManey Mojo::DOM 一个 XML 解析器。

标签: perl mojolicious


【解决方案1】:

这很简单。您可以只选择 Mojo::Collection 对象中所有有趣的元素(例如,这就是 Mojo::DOMchildren 方法所做的)并在迭代该集合时执行某种状态机之类的匹配。

这可能是最神奇的方法

是在标量上下文中使用 Perl 的 range operator ..

在标量上下文中,“..”返回一个布尔值。该运算符是双稳态的,就像一个触发器,并模拟 sed、awk 和各种编辑器的行范围(逗号)运算符。每个“..”运算符都维护自己的布尔状态,即使在调用包含它的子例程时也是如此。只要其左操作数为假,它就为假。一旦左操作数为真,范围运算符保持真,直到右操作数为真,之后范围运算符再次变为假。直到下一次评估范围运算符时它才会变为 false。

这是一个

简单示例

#!/usr/bin/env perl

use strict;
use warnings;
use feature 'say';
use Mojo::DOM;

# slurp all DATA lines
my $dom = Mojo::DOM->new(do { local $/; <DATA> });

# select all children of <div id="yay"> into a Mojo::Collection
my $yay = $dom->at('#yay')->children;

# select interesting ('..' operator in scalar context: flip-flop)
my $interesting = $yay->grep(sub { my $e = shift;
    $e->type eq 'h1' .. $e->type eq 'h2';
});

say $interesting->join("\n");

__DATA__
<div id="yay">
    <span>This isn't interesting</span>
    <h1>INTERESTING STARTS HERE</h1>
    <strong>SOMETHING INTERESTING</strong>
    <span>INTERESTING TOO</span>
    <h2>END OF INTERESTING</h2>
    <span>This isn't interesting</span>
</div>

输出

<h1>INTERESTING STARTS HERE</h1>
<strong>SOMETHING INTERESTING</strong>
<span>INTERESTING TOO</span>
<h2>END OF INTERESTING</h2>

说明

所以我使用 Mojo::Collection 的 grep 来过滤集合对象 $yay。因为它寻找真相,所以它为给定函数的返回值创建了一个标量上下文,所以.. 操作符就像一个触发器。它在第一次看到h1 元素后变为真,在第一次看到h2 元素后变为假,所以你会得到标题包括的所有行之间

由于我认为您了解一些 Perl,并且您可以与 .. 一起使用任意测试,希望这有助于解决您的问题!

【讨论】:

  • 是的 - 谢谢。 Mojo 的 grep 是我在这里学到的(Mojo::DOM 的功能、简单性和简洁性继续令人眼花缭乱,并且正在迅速取代我使用过的任何其他 Perl Web 解析器)。
猜你喜欢
  • 2021-08-07
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 2012-06-22
  • 2012-01-18
  • 1970-01-01
相关资源
最近更新 更多