如何使用perl从html网页中提取特定信息

时间:2011-06-23 13:01:12

标签: perl html-parsing

如果需要从一个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)&nbsp;<br>22/06/2011</font></b></p>
            </td>
          </tr></table>

3 个答案:

答案 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}}节点内。