Как я могу разобрать только часть файла HTML и игнорировать остальные? - PullRequest
0 голосов
/ 16 октября 2010

В каждом из 5000 HTML-файлов я должен получить только одну строку текста, которая является строкой 999. Как я могу сказать HTML :: Parser, что мне нужно только получить строку 999?

</p><h1>dataset 1:</h1>

&nbsp;<table border="0" bgcolor="#EFEFEF"  leftmargin="15" topmargin="5"><tr>  
<td><strong>name:</strong>&nbsp;</td>  <td width=500> myname one         </td></tr><tr>  
<td><strong>type:</strong>&nbsp;</td>  <td width=500>       type_one  (04313488)        </td></tr><tr>
<td><strong>aresss:</strong>&nbsp;</td><td>Friedrichstr. 70,&nbsp;73430&nbsp;Madrid</td></tr><tr>  
<td><strong>adresse_two:</strong>&nbsp;</td>  <td>          no_value        </td></tr><tr>  
<td><strong>telefone:</strong>&nbsp;</td>  <td>         0000736111/680040        </td></tr><tr>  
<td><strong>Fax:</strong>&nbsp;</td>  <td>          0000736111/680040        </td></tr><tr>  
<td><strong>E-Mail:</strong>&nbsp;</td>  <td>       Keine Angabe        </td></tr><tr>      
<td><strong>Internet:</strong>&nbsp;</td><td><a href="http://www.mysite.es" target="_blank">www.mysite.es</a><br></td></tr><tr> <td><strong>the office:</strong>&nbsp;</td>   
<td><a href="http://www.mysite_two" target="_blank">mysite_two </a><br></td></tr><tr> 
<td><strong>:</strong>&nbsp;</td><td> no_value </td></tr><tr> 
<td><strong>officer:</strong>&nbsp;</td>  <td> no_value        </td>  </td></tr><tr>
<td><strong>employees:</strong>&nbsp;</td>  <td> 259        </td></tr><tr>  
<td><strong>offices:</strong>&nbsp;</td>  <td>     8        </td></tr><tr>  
<td><strong>worker:</strong>&nbsp;</td>  <td>     no_value        </td></tr><tr>  
<td><strong>country:</strong>&nbsp;</td>  <td>    contryname        </td></tr><tr>  
<td><strong>the_council:</strong>&nbsp;</td>  <td> 

Вопрос в том, можно ли выполнить поиск по 5000 файлам с этим атрибутом: что интересует строка 999.Другими словами, могу ли я сказать HTML-парсеру, что он должен выглядеть (и извлекать) именно строку 999?


Здравствуйте, дорогой RedGritty Brick - у меня мало опыта с HTML :: TokeParser

use HTML::TreeBuilder::XPath;

my $tree = HTML::TreeBuilder::XPath->new;

#use real file name here
open(my $fh, "<", "file.html") or die $!;

$tree->parse_file($fh);

my ($name) = $tree->findnodes(qq{/html/body/table/tr[1]/td[2]});

print $name->as_text;

Кстати; RedGrittyBrick: См. Один из примеров сайтов: http://www.kultusportal -bw.de / servlet / PB / menu / 1188427 / index.html? COMPLETEHREF = http://www.kultus -bw.de / did_abfrage /detail.php? id = 04313488 в блоке, выделенном серым цветом, вы видите нужную информацию: 17 искомых строк.Обратите внимание - у меня есть 5000 различных HTML-файлов - все они структурированы одинаково!

Это значит, что я был бы рад иметь шаблон, который может быть запущен с HTML :: TokeParser :: Simple и DBI,

люблю получать подсказки

1 Ответ

1 голос
/ 16 октября 2010

Вы имеете в виду 999-ю строку или 999-ю строку таблицы?

Первая может быть

perl -ne 'print if $. == 999' /path/to/*.dat

Последняя будет включать анализатор HTML и некоторую логику выбора.Парсер Sax может быть лучше для быстрой обработки большого количества файлов.Вероятно, это зависит от того, какая версия HTML используется и является ли она «правильно сформированной».

В Perl есть много синтаксических анализаторов XML и HTML - вы имели в виду какой-то конкретный модуль?* РЕДАКТИРОВАТЬ:

Ваша проблема, кажется, ваше выражение XPath.Фактический HTML намного сложнее, чем предлагает ваш XPath.Следующее выражение работает лучше

#!/usr/bin/perl
use strict;
use warnings;
use LWP::Simple;
use HTML::TreeBuilder::XPath;

#
# replace this with a loop over 5000 existing files
#
my $url = 'http://www.kultusportal-bw.de/'.
          'servlet/PB/menu/1188427/index.html'.
          '?COMPLETEHREF='.
          'http://www.kultus-bw.de/'.
          'did_abfrage/detail.php?id=04313488';
my $html = get $url;

my $tree = HTML::TreeBuilder::XPath->new();
#
# within the loop process the html like this
#
$tree->parse($html);
$tree->eof;
print $tree->findvalue('//table[@bgcolor]/tr[1]');

Попробуйте вырезать вышеприведенное и вставить его в файл, а затем запустить его с помощью Perl.

...