gpt4 book ai didi

html - 使用 perl 脚本从 HTML 文件中提取信息

转载 作者:行者123 更新时间:2023-12-04 03:21:44 26 4
gpt4 key购买 nike

这是我提取标题下某些数据的代码 Item Drop% .我想提取 90.5%在那个标题下。但我只能提取整个列而不仅仅是那个值。任何的想法 ?

#!/usr/bin/perl

use strict;
use warnings;

use HTML::TableExtract;
use LWP::Simple;

my $file = 'data.html';
unless ( -e $file ) {
my $rc = getstore(
'proj/Desktop/folder1/data.html',
$file);
die "Failed to download document\n" unless $rc == 200;
}



my $te = HTML::TableExtract->new( headers => qw(Item Drop%)]);

$te->parse_file($file);

my ($table) = $te->tables;

foreach my $ts (ts->tables) {
print "Table (", join(',', $ts->coords), ");\n";
foreach my $row ($ts->rows) {
print join(',', @$row), "\n";
}
}
我的 data.html是:

..
..
..
<table align = "center" class="" style= .......>
<tr>
<th rowspan="2">EM</th>
<th colspan="2"><a href= "proj/Desktop/folder1/data.html" class = ..../th>
<td> 90.5%</td>
</tr>
..
..
..
..
<tr>
<th rowspan="2">EM</th>
<th colspan="2"><a href= "proj/Desktop/folder1/data.html" class = ..../th>
<td> 40%</td>
</tr>

</table>

最佳答案

这是基础知识,将给定的表格片段完成为一个有意义的表格。

use warnings;
use strict;
use feature 'say';

use HTML::TableExtract;
use Scalar::Util qw(looks_like_number);

my $filename = shift // die "Usage: $0 file\n";

my $te = HTML::TableExtract->new;
$te->parse_file($filename);

my ($tbl) = $te->tables; # one table in the sample file

my (@values1, @values2); # for 90.5% and such, processing options

foreach my $row ($tbl->rows) {
# Tables often come with empty fields; keep them, for counting and such
my @fields = map { defined($_) ? $_ : '--' } @$row;
printf "%8s ", $_ for @fields;
say '';

# Criteria for how to identify the number aren't explained,
# but may it be the fourth column in a row starting with 'EM'?
if ($fields[0] =~ /^\s*EM\s*$/) {
push @values1, $fields[3] =~ s/^\s*|\s*$//gr; # see note in text
}

# Or is it simply the number ending with % sign?
foreach my $fld (@fields) {
if ($fld =~ /\s*(.+)\s*%/ and looks_like_number($1)) {
push @values2, $1;
}
}
}
say "@values1";
say "@values2";
注意: /r正则表达式中的修饰符是 added in v5.14 .如果您的 Perl 较旧,请参阅脚注†
演示中显示了许多处理过程。不需要打印这些值(一旦你弄清楚感兴趣的项目在哪里),我也不会替换 undef带有 -- 的字段,为了更清晰的打印输出,而是使用 '' (空字符串)。此外,我们需要一个标准,而不是两个。
请注意,在第一种情况下,我们保留了 %签名,并使用正则表达式清理空格;在第二种情况下,百分号被省略(并且空格最终被正则表达式自然地清除,在匹配中)。当然,这些都可以根据您的实际需要进行调整。
由于既没有给出实际的表,也没有给出其中的数据,也没有给出确切的标准,我只能提供提示和代码示例。有了更多的细节,这可以变得更具体。
请注意,当涉及到确定最后的细节时,通常是通过正则表达式,事情往往变得挑剔和对细节敏感;这么小心。

上面使用的由问题中的片段完成的 html 文件:
<html>    
<style> th, td { padding: 10px } </style> <!-- to better see it -->

<table align="center" rules="all">
<tr>
<th rowspan="2">EM</th>
<th colspan="2"><a href="http://www.google.com">ggl</a></th>
<td> 90.5%</td>
</tr>
<tr>
<td>data</td> <td>more</td> <td>etc</td>
</tr>

<tr>
<th rowspan="2">EM</th>
<th colspan="2"><a href="http://www.google.com">ggl</a></th>
<td> 0.0%</td>
</tr>
<tr> <td>data</td> <td>more</td> <td>etc</td> </tr>
</table>

</html>

/r替换正则表达式上的修饰符使其返回更改后的字符串(并保持原样)。这正是人们在许多情况下想要的,这里的代码就是一个很好的例子(我们只是想将更改后的字符串添加到数组中)。
但是,在 5.14 版之前的 Perls 中,当引入此功能时,您必须做其他事情:如果您需要保持原始变量不变,则创建一个具有更改的新变量,或者更改该原始变量然后使用它。
由于我们在这里修剪了额外的空间,因此最好简单地更改 $fields[3]然后将其添加到数组中。所以代替
if ($fields[0] =~ /^\s*EM\s*$/) {
push @values1, $fields[3] =~ s/^\s*|\s*$//gr;
}
if ($fields[0] =~ /^\s*EM\s*$/) {
$fields[3] =~ s/^\s*|\s*$//g; # strip leading/trailing spaces
push @values1, $fields[3];
}

关于html - 使用 perl 脚本从 HTML 文件中提取信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68371904/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com