如何解决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\"> 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>
解决方法
有几个步骤。
使用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\"> 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。这也是最难的,我可以为您提供最少帮助的部分。您只需要进行试验。
祝好运。
, 如果您需要从HTML表中提取数据,则
use HTML::TableExtract;
将是一个不错的选择。
, 当然,每个人都会有自己的最爱。我更喜欢HTML::TokeParser
,我发现它易于理解和使用(一旦您对返回数组的工作原理一清二楚)。当然,我必须将您指向SO经典文章,提醒您不要使用正则表达式解析HTML。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。