perl 中的 HTML 解析

Posted

技术标签:

【中文标题】perl 中的 HTML 解析【英文标题】:HTML parsing in perl 【发布时间】:2011-06-03 15:30:34 【问题描述】:

我正在尝试使用 perl 解析以下 html 结构。我需要选择所有包含类消息和 id 的 dd 元素。 我希望脚本做的只是遍历所有 dd 元素并打印出 dd 元素的 id,但它需要忽略第一个 dd 元素,因为它是静态的并且不会改变。

它可以与任何 perl 模块一起使用,只要它可以从 cpan 安装以方便我。我在 perl 和解析 html 方面没有太多经验,所以任何指针都会很有帮助。

谢谢:)

HTML 结构:

<pre><code>
<html>
<head>
</head>
<body>
 .....other elements
    <div id="messages">
        <div class="header"></div>
        <dl>
            <dd class="message unread mc-friend mc-message">This is just a random message, do not parse</dd>
            <dd id="msg2" class="message unread mc-message">
                Hello
            </div>
            <dd id="msg3" class="message unread mc-message">
                Hello
            </dd>
        </dl>
    </div>
</body>
</html>
</pre></code>

【问题讨论】:

:) 一般来说 HTML::Parser 很棒,但是您可能有特定的需求,可以将您指向其他地方...这里也有一个很好的类似问题的存档,可能会给您一些有用的提示. 【参考方案1】:

看看HTML::Parser 或者更好的是HTML::TreeBuilder

更多关于TreeBuilder。

【讨论】:

我会在 XML::LibXML 中加入 XPath 选择器,但我更喜欢 Web::Query 和 Mojo::DOM 的 CSS 选择器。【参考方案2】:

类似这样,快速简单:

#! /usr/bin/perl
use strict;
use warnings;

use Mojo::DOM;

my $html = "Your HTML goes here";

my $dom = Mojo::DOM->new;
$dom->parse($html);
my $skip;
for my $dd ($dom->find('dd[class*="message"]')->each) 
    print $dd->attrs->id, "\n" if $skip++;

【讨论】:

完美,Mojo::DOM 正是我想要的。 :D

以上是关于perl 中的 HTML 解析的主要内容,如果未能解决你的问题,请参考以下文章

Perl 6 中的列表解析

Perl模块 Getopt::Long 解析

将 html 嵌套列表解析为 perl 数组

Perl 解析 Outlook 收件箱中的电子邮件和附件

Perl HTML::解析器错误;未定义的子程序 &main::1

我通过perl更新查询时出现解析错误