使用 Mojolicious 用户代理解析 HTML

2023-12-21

我有类似这样的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 之间的所有内容?或者更一般地说,任意两个给定标签集之间的所有内容?


这非常简单。您可以选择一个中所有有趣的元素Mojo::集合 http://mojolicio.us/perldoc/Mojo/Collection对象(这就是Mojo::DOM http://mojolicio.us/perldoc/Mojo/DOM's children http://mojolicio.us/perldoc/Mojo/DOM#children方法例如)并在迭代该集合时执行某种类似状态机的匹配。

可能是最神奇的方法

是使用Perl的范围运算符.. http://perldoc.perl.org/perlop.html#Range-Operators在标量上下文中:

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

Here's a

简单的例子

#!/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>

Output

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

解释

所以我使用 Mojo::Collection 的grep http://mojolicio.us/perldoc/Mojo/Collection#grep过滤集合对象$yay。因为它寻找真理,所以它创造了一个标量上下文对于给定函数的返回值,所以..运算符的作用类似于触发器。第一次看到后就变成真的了h1元素并在第一次看到 a 后变为 falseh2元素,这样你就可以得到所有行between那个头条新闻包括他们自己。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Mojolicious 用户代理解析 HTML 的相关文章

  • 如何在 Perl 中使用 use strict 一次一行处理多行字符串?

    我正在尝试找出 PBP 批准的正确方法来一次一行处理多行字符串 许多 Perl 编码人员建议将多行字符串视为文件句柄 除非您在脚本中使用 use strict 否则它可以正常工作 然后 您会收到编译器发出的警告 提示在使用严格引用时无法使用
  • Perl Tk 模块有哪些缺点?

    与在 Perl 中创建 GUI 的其他解决方案相比 Tk 模块有哪些缺点 我最近浏览了 Perl 的各种 gui 模块 这是我的总结 免责声明 最终我发现现有模块都不能满足我的需求 所以我开始编写自己的 gui 工具包 Tk 工作起来很不错
  • 使用 SIGINT 默认处理程序时从 system() 返回值

    我遇到了一些奇怪的返回值system 当子进程从终端接收到 SIGINT 时 解释一下 从 Perl 脚本parent pl I used system 运行另一个 Perl 脚本作为子进程 但我还需要通过 shell 运行子进程 所以我使
  • 使用 Perl 获取 值

    因此 我有一个报告工具 可以在 HTML 文件中输出作业调度统计信息 并且我希望使用 Perl 来使用这些数据 但我不知道如何单步浏览 HTML 表 我知道如何使用 jQuery 来做到这一点 find tr each function v
  • 在perl中调用基本构造函数

    从 Perl 中的类构造函数调用基本构造函数的正确方法是什么 我见过这样的语法 my class shift my a shift my b shift my self class gt SUPER new a b return self
  • grep 通过彩色文本,例如海湾合作委员会 |颜色gcc | grep 正则表达式

    在 grep 管道输出时 如何使 grep 尊重 ANSI 颜色转义 我很高兴使用其他东西 perl 而不是 grep 我的用户案例 我想要 gcc foobar c colorgcc grep regexp ls color grep f
  • 将 HTML 转换为 Excel 的最佳方法是什么

    我有一个 HTML 页面 其中包含 Flash 图表 FusionCharts 和 HTML 表格 我需要将这整个事情转换成Excel HTML 表格应显示在 Excel 工作表的单元格中 Flash 图表可以显示为图像 我们可以使用任何开
  • HTTP POST 操作出现错误代码 302

    我有一个 perl 脚本 它将数据发送到我用 php 编写的 Web 服务 这是代码 use LWP UserAgent my ua LWP UserAgent gt new my server endpoint http example
  • 使用Perl/DBI/MySQL/InnoDB查找外键信息

    我想以编程方式查找 MySQL 数据库中特定 InnoDB 表的外键 我正在使用 Perl 我偶然发现 dbh gt foreign key info 我刚刚尝试使用它 但似乎有点错误 它不会返回 ON DELETE 和 ON UPDATE
  • 为什么我的 Perl 线程在第一次运行时随机执行,但在后续运行时按顺序执行?

    在测试问题代码的过程中如何在 Perl 中的调用之间存储每个线程的状态 https stackoverflow com questions 2317114我注意到 第一次执行脚本时 线程执行彼此很好地交错 但在脚本的所有后续执行中 所有线程
  • 如何在 grep 中每个文件匹配一次?

    是否有任何 grep 选项可以让我控制匹配总数 但在每个文件的第一个匹配处停止 Example 如果我这样做grep ri include coffee re 我明白了 app coffee express require express
  • Perl 守护进程不与 Sleep() 一起工作

    我使用编写了一个简单的测试守护进程过程 守护进程 http search cpan org deti Proc Daemon 0 14 lib Proc Daemon pod 这是守护进程 usr bin perl use Proc Dae
  • 如何使用 Perl 将连接数据线转换为方案块?

    我正在寻找一种将信号连接转换为简单方案或图表的方法 假设我有 2 个组件 周围有 2 条线路 信号 component A input S1 output S2 component B input S2 output S1 这将是输入数据文
  • 如何有条件地使用 Perl 中的模块?

    我想在 Perl 中做这样的事情 Module1 ReportHashFile1 ReportHashFile1 pm Module2 ReportHashFile2 ReportHashFile2 pm if Condition1 use
  • 为什么安装某些 CPAN 模块需要 root 权限?

    我需要在没有 root 权限的 Linux 机器上安装一些 CPAN 模块 安装Spreadsheet WriteExcel http search cpan org perldoc Spreadsheet WriteExcel进行得很顺利
  • perl 中的大写重音字符

    有没有办法在perl中大写重音字符 my string l phant print uc string 这样它实际上会打印 L PHANT 我的 perl 脚本以 ISO 8859 1 编码 string 以相同编码打印在 xml 文件中
  • 如何在 Perl 中生成数组的所有排列?

    生成所有内容的最佳 优雅 简单 高效 方式是什么 n perl 中数组的排列 例如 如果我有一个数组 arr 0 1 2 我想输出所有排列 0 1 2 0 2 1 1 0 2 1 2 0 2 0 1 2 1 0 它可能应该是一个返回迭代器的
  • 为什么没有调用回调?

    我有来自的示例脚本B OP检查 https metacpan org pod B OPCheck SYNOPSIS模块经过修改PL op name to padsv https github com Perl perl5 blob blea
  • 如何引用 Perl 子例程?

    我在弄清楚如何引用外部模块文件中的子例程时遇到了一些麻烦 现在 我正在这样做 外部文件 package settingsGeneral sub printScreen print 0 Main use settingsGeneral my
  • 替换字符串中的重复字符串

    我正在尝试查找 并替换 字符串中重复的字符串 我的字符串可以是这样的 Lorem ipsum dolor 坐阿梅特坐 阿梅特坐 阿梅特坐诺斯特鲁德实习amit situllamco Laboris nisi ut aliquip ex ea

随机推荐