Как получить значение тега HTML, используя HTML::Tree?
Допустим, у меня есть массив, который содержит содержимое тега 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>
]
Допустим, я хочу получить идентификатор тега "div" из содержимого @array:
Я делаю это путем:
$tree=HTML::TreeBuilder->new_from_content(@array);
$first_match = $tree->find_by_attribute('hrefmode' => 'ajax-html');
$id = $first_match->attr('id');
Это прекрасно работает в тех случаях, когда для атрибута есть одно значение. Но как мне извлечь 866346569493123700 из тега script в @array?
Любая помощь по этому вопросу будет высоко ценится, так как я пытался получить это в течение нескольких часов
1 ответ
Вы используете HTML::TreeBuilder для анализа HTML очень хорошо. Вы столкнулись с проблемой, потому что вы также хотите получить информацию изнутри <script>
тег содержит JavaScript. К сожалению, вышеупомянутый модуль не поможет вам, кроме изоляции JS.
Учитывая простоту вашей цели, я считаю, что я просто использовал бы регулярное выражение, чтобы найти идентификатор вкладки. Последняя команда 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>