【问题标题】:how to extract specific information from html webpage using perl如何使用perl从html网页中提取特定信息
【发布时间】:2011-09-21 05:10:38
【问题描述】:

如果需要从一个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>

【问题讨论】:

    标签: perl html-parsing


    【解决方案1】:

    我会为此使用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 标记。这可能会在未来发生变化,因此如果(何时!)代码中断,那是您必须首先查看的地方。

    【讨论】:

    【解决方案2】:

    你可以使用类似的东西:

    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)
    

    【讨论】:

      【解决方案3】:

      Mirod 的回答很棒。这是 Perl,我将在那里提出另一种方法。

      假设您在input.html 中有HTML 文件。这是一个使用 HTML::TreeBuilder 模块提取文本的 Perl 程序:

      #!/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 sn-p 上运行时的输出:

      <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"
                    " "
      

      您可以看到您感兴趣的文本位于地址为0.1.0.2.0.0.0.1 的font color 节点内。

      【讨论】:

        猜你喜欢
        • 2023-01-03
        • 2014-11-23
        • 2016-08-28
        • 2015-10-06
        • 1970-01-01
        • 1970-01-01
        • 2019-05-09
        • 1970-01-01
        • 2011-06-06
        相关资源
        最近更新 更多