perl解析html tree buidler或element或parser

问题描述

| 我正在尝试使用perl提取一些html信息。我发现有关TreeBuilder和Element和Parser的信息,我应该使用哪一个? 我将如何提取以下行的名称和值? 同样,这也嵌入到html结构中,真正定位我想要的字段的唯一方法是给定列“目录数”的值。 还是我应该对整个HTML进行正则表达式?
<table cellspacing=\"0\">
    <tbody><tr><td class=\"black\">Number of directories</td><td class=\"black\">:</td><td class=\"black\">&nbsp;80</td></tr>
        <tr><td class=\"black\">Number&nbsp;of&nbsp;monitored&nbsp;source&nbsp;files</td><td class=\"black\">:</td><td class=\"black\">&nbsp;425</td></tr>
        <tr><td class=\"black\">Number of functions</td><td class=\"black\">:</td><td class=\"black\">&nbsp;6245</td></tr>
        <tr><td class=\"black\">Number&nbsp;of&nbsp;source&nbsp;lines</td><td class=\"black\">:</td><td class=\"black\">&nbsp;3245</td></tr>
        <tr><td class=\"black\">Number&nbsp;of&nbsp;measurement&nbsp;points</td><td class=\"black\">:</td><td class=\"black\">&nbsp;2457</td></tr>
        <tr><td class=\"red\">TER</td><td class=\"red\">:</td><td class=\"red\">&nbsp;<strong>12%</strong>&nbsp;(decision)</td></tr>
    </tbody></table>
    

解决方法

        有几个步骤。 使用HTML :: TreeBuilder \的构造函数之一来解析HTML。 通过调用
elementify
将根目录处的HTML :: TreeBuilder对象转换为HTML :: Element。 充分理解HTML的结构,以便您可以告诉HTML :: Element :: look_down()如何找到您感兴趣的位。您可以几乎可以想象的任何形式指定条件。 使用HTML :: Element :: look_down(),content_list(),left(),right()和相关方法遍历感兴趣区域并提取数据。请勿使用
traverse()
-这是一个坏主意。 首先将您收集的数据传递给任何要求它的系统。 这是一些代码:
my $blarg = <<\'END_HTML\';
<table cellspacing=\"0\">
    <tbody><tr><td class=\"black\">Number of directories</td><td class=\"black\">:</td><td class=\"black\">&nbsp;80</td></tr>
        <tr><td class=\"black\">Number&nbsp;of&nbsp;monitored&nbsp;source&nbsp;files</td><td class=\"black\">:</td><td class=\"black\">&nbsp;425</td></tr>
        <tr><td class=\"black\">Number of functions</td><td class=\"black\">:</td><td class=\"black\">&nbsp;6245</td></tr>
        <tr><td class=\"black\">Number&nbsp;of&nbsp;source&nbsp;lines</td><td class=\"black\">:</td><td class=\"black\">&nbsp;3245</td></tr>
        <tr><td class=\"black\">Number&nbsp;of&nbsp;measurement&nbsp;points</td><td class=\"black\">:</td><td class=\"black\">&nbsp;2457</td></tr>
        <tr><td class=\"red\">TER</td><td class=\"red\">:</td><td class=\"red\">&nbsp;<strong>12%</strong>&nbsp;(decision)</td></tr>
    </tbody></table>
END_HTML

# Use any of the constructors to get your base object.  See the pod.
my $tree = HTML::TreeBuilder->new_from_content($blarg);

$tree->elementify;  # Make it just a plain HTML::Element object.

# Iterate over a list of rows:  look_down and related functions provide powerful ways to find matching elements.  Read the pod for more details.
my %crud_from_table;
for my $row ( $tree->look_down( _tag => \'tr\' ) ) {
    my ($key,$value) = map $_->as_text,$row->content_list;  # assumes two td per row.
    $crud_from_table{$key} = $value;
}
最重要的部分在于理解并能够向
look_down()
描述如何找到所需的信息。有时,您可以通过匹配ID来向右缩放。其他时候,您必须查找带有表的类'foo \'的第三个div。这也是最难的,我可以为您提供最少帮助的部分。您只需要进行试验。 祝好运。     ,        如果您需要从HTML表中提取数据,则
use HTML::TableExtract;
将是一个不错的选择。     ,        当然,每个人都会有自己的最爱。我更喜欢
HTML::TokeParser
,我发现它易于理解和使用(一旦您对返回数组的工作原理一清二楚)。当然,我必须将您指向SO经典文章,提醒您不要使用正则表达式解析HTML。