Как извлечь конкретную информацию из HTML-страницы с помощью Perl - PullRequest
3 голосов
/ 23 июня 2011

если информацию «XYZ 81.6 (-0.1)» необходимо извлечь из одной html-страницы, как это можно сделать с помощью 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 ]

4 голосов
/ 23 июня 2011

Я бы использовал для этого 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. Вероятно, это изменится в будущем, поэтому, если (когда!) Код сломается, вам придется сначала посмотреть.

0 голосов
/ 23 июня 2011

Ответ Мирода потрясающий. Будучи Perl, я добавлю другой подход.

Предположим, у вас есть файл HTML в input.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, который имеет адрес 0.1.0.2.0.0.0.1.

0 голосов
/ 23 июня 2011

Вы можете использовать что-то подобное:

bash-3.2$ perl -MLWP::Simple -le ' $current_value = get("/6441271/kak-izvlech-konkretnuy-informatsiy-iz-html-stranitsy-s-pomoschy-perl"); if ($current_value=~/(XYZ\s\d+\.\d+\s\(.*?\))/s) { print "Matched pattern is:\t $1";} '
Matched pattern is:      XYZ 81.6 (-0.1)
...