如果需要从一个html网页中提取“XYZ 81.6(-0.1)”的信息,怎么能用perl完成?非常感谢。
<table border="0" width="100%">
<caption valign="top">
<p class="InfoContent"><b><br></b>
</caption>
<tr>
<td colspan="3"><p class="InfoContent"><b>ABC</b></td>
</tr>
<tr>
<td valign="top" height="61" width="31%">
<p class="InfoContent"><b><font color="#0000FF">XYZ 81.6 (-0.1) <br>22/06/2011</font></b></p>
</td>
</tr></table>
答案 0 :(得分:4)
我会使用HTML::TreeBuilder::XPath(是的,这是一个无耻的插件!):
#!/usr/bin/perl
use strict;
use warnings;
use HTML::TreeBuilder::XPath;
my $t= HTML::TreeBuilder::XPath->new_from_file( shift @ARGV);
my $text= $t->findvalue( '//p[@class="InfoContent"]/b/font[@color="#0000FF"]');
$text=~ s{\).*}{)};
print "found '$text'\n";
它非常脆弱:据我所知,将XPath表达式缩小到你想要的唯一方法就是使用font
标签。这可能会在未来发生变化,所以如果(当!)代码中断,那么你必须首先查看。
答案 1 :(得分:0)
你可以使用类似的东西:
bash-3.2$ perl -MLWP::Simple -le ' $current_value = get("http://stackoverflow.com/questions/6454398/how-to-extract-specific-information-from-html-webpage-using-perl"); if ($current_value=~/(XYZ\s\d+\.\d+\s\(.*?\))/s) { print "Matched pattern is:\t $1";} '
Matched pattern is: XYZ 81.6 (-0.1)
答案 2 :(得分:0)
Mirod的答案很棒。这是Perl,我会抛出另一种方法。
假设您在input.html
中有HTML文件。这是一个Perl程序,它使用HTML::TreeBuilder
模块来提取文本:
#!/usr/bin/perl
use 5.10.0 ;
use strict ;
use warnings ;
use HTML::TreeBuilder ;
my $tree = HTML::TreeBuilder -> new () ;
$tree -> parse_file ( 'input.html' ) ;
my $text = ($tree -> address ( '0.1.0.2.0.0.0.1' ) -> content_list ()) [0] ;
say $text ;
运行它:
/tmp/tmp $ ./_extract-a.pl
XYZ 81.6 (-0.1)�
那我怎么想出那个'0.1.0.2.0.0.0.1'的幻数?通过解析HTML文件得到的树中的每个节点都有一个“地址”。您感兴趣的文本的地址为“0.1.0.2.0.0.0.1”。
那么,如何显示节点地址?这是我称之为treebuilder-dump
的小程序;当您传递一个HTML文件时,它会显示标有以下节点的文件:
#!/usr/bin/perl
use 5.10.0 ;
use strict ;
use warnings ;
use HTML::TreeBuilder ;
my $tree = HTML::TreeBuilder->new ;
if ( ! @ARGV == 1 ) { die "No file provided" ; }
if ( ! -f $ARGV[0] ) { die "File does not exist: $ARGV[0]" ; }
$tree->parse_file ( $ARGV[0] ) ;
$tree->dump () ;
$tree->delete () ;
例如,这是在HTML代码段上运行时的输出:
<html> @0 (IMPLICIT)
<head> @0.0 (IMPLICIT)
<body> @0.1 (IMPLICIT)
<table border="0" width="100%"> @0.1.0
<caption valign="top"> @0.1.0.0
<p class="InfoContent"> @0.1.0.0.0
<b> @0.1.0.0.0.0
<br /> @0.1.0.0.0.0.0
<tr> @0.1.0.1
<td colspan="3"> @0.1.0.1.0
<p class="InfoContent"> @0.1.0.1.0.0
<b> @0.1.0.1.0.0.0
"ABC"
<tr> @0.1.0.2
<td height="61" valign="top" width="31%"> @0.1.0.2.0
<p class="InfoContent"> @0.1.0.2.0.0
<b> @0.1.0.2.0.0.0
" "
<font color="#0000FF"> @0.1.0.2.0.0.0.1
"XYZ 81.6 (-0.1)�"
<br /> @0.1.0.2.0.0.0.1.1
"22/06/2011"
" "
您可以看到您感兴趣的文字位于地址为font color
的{{1}}节点内。