如何使用HTML :: Tree获取HTML标记的值?

时间:2014-03-16 10:57:14

标签: perl cpan html-tree html-treebuilder

假设我有一个数组,其中包含body标签的内容,如下所示:     print Dumper(\ @ array);

$VAR1 = 

[

<body>

<table width=\'100%\' height=\'100%\'>

<tr>

<td width=\'100%\' height=\'100%\'

valign=\'top\'><div style=\'height:100%\' hrefmode=\'ajax-html\' id=\'a_tabbar\' 

width=\'100%\'  imgpath=\'../images/datagrid/\' skinColors=\'#FCFBFC,#F4F3EE\'/>

</td>

</tr>

</table>

<script>

tabbar=newdhtmlXTabBar(\'a_tabbar\',\'top\');
tabbar.setImagePath(\'../images/datagrid/\');
tabbar.setSkinColors(\'#FCFBFC\',\'#F4F3EE\');
tabbar.setHrefMode(\'ajax-html\');

</script>

<script>
tabbar.addTab(\'866346569493123700\',\'Details \',\'242px\'); 
tabbar.setContentHref(\'866346569493123700\',\'../reports/dhtmlgridqueryhandler.jsp?id=866346569493123700&oracleDb=read&htmlDataId=&Type=generic&queryCode=GetDetails\');
tabbar.setTabActive(\'866346569493123700\');

</script>

</body>
]

让我们说我想从@array的内容中获取“div”标签的id:

我是这样做的:

$tree=HTML::TreeBuilder->new_from_content(@array);
$first_match = $tree->find_by_attribute('hrefmode' => 'ajax-html');
$id = $first_match->attr('id');

这适用于属性有单个值的情况。 但是如何从@array中的脚本标记中获取866346569493123700?

任何有关这方面的帮助都会非常感激,因为我一直试图让这个问题持续数小时

1 个答案:

答案 0 :(得分:1)

您使用HTML::TreeBuilder解析HTML非常好。您遇到了问题,因为您还需要包含JavaScript的<script>标记内的信息。不幸的是,上述模块除了隔离JS之外不会帮助你。

鉴于您的目标简单,我相信我只是使用正则表达式来查找标签ID。最后一个命令tabbar.setTabActive非常简单,并且很可能不会发生太大变化,因为它是一个只接受一个值的函数,并且是创建和激活这个新选项卡的功能的组成部分。

以下代码演示了迭代脚本标记,直到找到tabid匹配:

use HTML::TreeBuilder;

use strict;
use warnings;

my $root = HTML::TreeBuilder->new_from_content(<DATA>);

if (my $element = $root->look_down('_tag' => 'div', 'hrefmode' => 'ajax-html')) {
    print "div.id = '" . $element->attr('id') . "'\n";
} else {
    warn "div.id not found";
}

my $tabid = '';
for ($root->find_by_tag_name('script')) {
    my $scripttext = $_->as_HTML;
    if ($scripttext =~ /tabbar.setTabActive\('(\d+)'\);/) {
        $tabid = $1;
        print "TabID = '$tabid'";
        last;
    }
}
warn "Tab ID not found\n" if ! $tabid;


__DATA__
<body>
<table width='100%' height='100%'>
<tr>
<td width='100%' height='100%'
valign='top'><div style='height:100%' hrefmode='ajax-html' id='a_tabbar' 
width='100%'  imgpath='../images/datagrid/' skinColors='#FCFBFC,#F4F3EE'/>
</td>
</tr>
</table>
<script>
tabbar=newdhtmlXTabBar('a_tabbar','top');
tabbar.setImagePath('../images/datagrid/');
tabbar.setSkinColors('#FCFBFC','#F4F3EE');
tabbar.setHrefMode('ajax-html');
</script>
<script>
tabbar.addTab('866346569493123700','Details ','242px'); 
tabbar.setContentHref('866346569493123700','../reports/dhtmlgridqueryhandler.jsp?id=866346569493123700&oracleDb=read&htmlDataId=&Type=generic&queryCode=GetDetails');
tabbar.setTabActive('866346569493123700');
</script>
</body>