perl解析html树构建器或元素解析器

时间:2011-06-14 00:16:52

标签: perl

我正在尝试使用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>

3 个答案:

答案 0 :(得分:1)

如果您需要从HTML表中提取数据,那么

use HTML::TableExtract;

将是一个不错的选择。

答案 1 :(得分:0)

当然每个人都会有自己的最爱。我更喜欢HTML::TokeParser,我觉得它很容易理解和使用(一旦你克服了返回数组的工作方式)。当然,我必须指向SO经典帖子,提醒您please not parse HTML with regular expressions

答案 2 :(得分:0)

有几个步骤。

  1. 使用HTML :: TreeBuilder的构造函数之一来解析HTML。
  2. 通过调用elementify将根目录下的HTML :: TreeBuilder对象转换为HTML :: Element。
  3. 充分理解HTML的结构,以便告诉HTML::Element::look_down()如何找到您感兴趣的位。您可以用几乎任何可想象的形式指定标准。
  4. 使用HTML :: Element :: look_down(),content_list(),left(),right()和相关方法遍历感兴趣的区域并提取数据。 不要使用traverse() - 这是一个坏主意。
  5. 首先将您收集的数据传递给所要求的任何系统。
  6. 以下是一些代码:

    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,里面有一个表。这也是最困难的部分,我可以帮助你最少。你只需要进行实验。

    祝你好运。