Ответ Мирода потрясающий. Будучи 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
.