我已经解决了这个问题:原来我用WWW加载的页面:: Mechanize使用AJAX加载<tbody>
内的所有内容,因此在创建$ html变量时它没有被加载。
现在我必须看看如何获得这个动态内容...
我正在尝试解析网页中表格的内容。 <table>
包含<thead>
和<tbody>
。当我从表格的<tbody>
部分获取内容时,我发现它们都没有。我只获取<thead>
内的内容。
我尝试了几种不同的方法,所有这些方法都只是在<tbody>
内没有给我任何内容。
使用HTML :: TreeBuilder
my $tb = HTML::TreeBuilder->new();
$tb->parse($html);
my $table = $tb->look_down( _tag => 'tbody', id => 'tbody-id' );
使用HTML :: TableExtract
my $te = HTML::TableExtract->new( attribs => { id => 'table-id' } );
$te->parse($html);
my $table=$te->first_table_found;
当我尝试执行表格的print Dumper($table);
时,我显示我找到了<table>
并且只能看到<thead>
或{{}内的表格内容1}}以及对其父级的引用,其中包含<tbody>
的所有内容。
我不太关心<thead>
中的内容我只需要<thead>
中的表格内容。
我不确定我做错了什么,从哪里开始。
答案 0 :(得分:1)
HTML有效吗?我花了几分钟才得到以下代码,因为我没有正确关闭其中一个代码:
use strict;
use warnings;
use HTML::TreeBuilder;
use Perl6::Say;
my $html = << 'HTML';
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>title</title>
<link rel="stylesheet" href="style.css">
<script src="script.js"></script>
</head>
<body>
<table>
<caption>Caption</caption>
<thead>
<tr>
<th>Header</th>
</tr>
</thead>
<tbody>
<tr>
<td>Body</td>
</tr>
</tbody>
</table>
</body>
</html>
HTML
my $tree = HTML::TreeBuilder->new->parse_content($html);
my $table = $tree->look_down('_tag', 'table');
my $caption = $table->look_down('_tag', 'caption');
my $thead = $table->look_down('_tag', 'thead');
my $tbody = $table->look_down('_tag', 'tbody');
say $caption->as_HTML;
# <caption>Caption</caption>
say $thead->as_HTML;
# <thead><tr><th>Header</th></tr></thead>
say $tbody->as_HTML;
# <tbody><tr><td>Body</td></tr></tbody>