我读了很多问题和答案,但我找不到一个直接的答案。所有的答案要么非常笼统,要么与我想要做的不同。到目前为止,我需要使用HTML::TableExtract或HTML::TreeBuilder::XPath,但我不能真正使用它们来存储值。我可以以某种方式获得表行的值,并使用Dumper显示它们。
如下所示:
foreach my $ts ($tree->table_states) {
foreach my $row ($ts->rows) {
push (@fir , (Dumper $row));
} }
print @sec;但这并不是我真正想要的。我将添加要存储值的HTML表的结构:
<table><caption><b>Table 1 </b>bla bla bla</caption>
<tbody>
<tr>
<th ><p>Foo</p>
</th>
<td ><p>Bar</p>
</td>
</tr>
<tr>
<th ><p>Foo-1</p>
</th>
<td ><p>Bar-1</p>
</td>
</tr>
<tr>
<th ><p>Formula</p>
</th>
<td><p>Formula1-1</p>
<p>Formula1-2</p>
<p>Formula1-3</p>
<p>Formula1-4</p>
<p>Formula1-5</p>
</td>
</tr>
<tr>
<th><p>Foo-2</p>
</th>
<td ><p>Bar-2</p>
</td>
</tr>
<tr>
<th ><p>Foo-3</p>
</th>
<td ><p>Bar-3</p>
<p>Bar-3-1</p>
</td>
</tr>
</tbody>
</table>如果我可以将行值成对存储在一起,那将会很方便。
预期输出将类似于具有以下值的数组:(Foo,Bar,Foo-1,Bar-1,Formula,Formula-1 Formula-2 Formula-3 Formula-4 Formula-5,...)对我来说,重要的是学习如何存储每个标记的值,以及如何在标记树中移动。
发布于 2012-04-23 22:45:14
学习XPath和DOM操作。
use strictures;
use HTML::TreeBuilder::XPath qw();
my $dom = HTML::TreeBuilder::XPath->new;
$dom->parse_file('10280979.html');
my %extract;
@extract{$dom->findnodes_as_strings('//th')} =
map {[$_->findvalues('p')]} $dom->findnodes('//td');
__END__
# %extract = (
# Foo => [qw(Bar)],
# 'Foo-1' => [qw(Bar-1)],
# 'Foo-2' => [qw(Bar-2)],
# 'Foo-3' => [qw(Bar-3 Bar-3-1)],
# Formula => [qw(Formula1-1 Formula1-2 Formula1-3 Formula1-4 Formula1-5)],
# )https://stackoverflow.com/questions/10280979
复制相似问题