我正在尝试使用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"> 80</td></tr>
<tr><td class="black">Number of monitored source files</td><td class="black">:</td><td class="black"> 425</td></tr>
<tr><td class="black">Number of functions</td><td class="black">:</td><td class="black"> 6245</td></tr>
<tr><td class="black">Number of source lines</td><td class="black">:</td><td class="black"> 3245</td></tr>
<tr><td class="black">Number of measurement points</td><td class="black">:</td><td class="black"> 2457</td></tr>
<tr><td class="red">TER</td><td class="red">:</td><td class="red"> <strong>12%</strong> (decision)</td></tr>
</tbody></table>
答案 0 :(得分:1)
如果您需要从HTML表中提取数据,那么
use HTML::TableExtract;
将是一个不错的选择。
答案 1 :(得分:0)
当然每个人都会有自己的最爱。我更喜欢HTML::TokeParser
,我觉得它很容易理解和使用(一旦你克服了返回数组的工作方式)。当然,我必须指向SO经典帖子,提醒您please not parse HTML with regular expressions。
答案 2 :(得分:0)
有几个步骤。
elementify
将根目录下的HTML :: TreeBuilder对象转换为HTML :: Element。traverse()
- 这是一个坏主意。 以下是一些代码:
my $blarg = <<'END_HTML';
<table cellspacing="0">
<tbody><tr><td class="black">Number of directories</td><td class="black">:</td><td class="black"> 80</td></tr>
<tr><td class="black">Number of monitored source files</td><td class="black">:</td><td class="black"> 425</td></tr>
<tr><td class="black">Number of functions</td><td class="black">:</td><td class="black"> 6245</td></tr>
<tr><td class="black">Number of source lines</td><td class="black">:</td><td class="black"> 3245</td></tr>
<tr><td class="black">Number of measurement points</td><td class="black">:</td><td class="black"> 2457</td></tr>
<tr><td class="red">TER</td><td class="red">:</td><td class="red"> <strong>12%</strong> (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,里面有一个表。这也是最困难的部分,我可以帮助你最少。你只需要进行实验。