我已经解决了这个问题:原来我用WWW::Mechanical加载的页面使用AJAX加载<tbody>
中的所有内容,所以在我创建$html变量时不会加载它。现在我必须看看如何获得这些动态内容。。。
我正在尝试解析网页中表格的内容。CCD_ 2包含CCD_ 3和CCD_。当我从表的<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>
或<tbody>
内部的表内容以及对其父级的引用,该引用包含来自<thead>
的所有内容。
我可以不太关心<thead>
中的内容,我只需要<tbody>
中的表内容。
我不知道我做错了什么,也不知道该何去何从。
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>