如何只解析HTML文件的一部分而忽略其余部分?

时间:2010-10-15 23:31:26

标签: perl html-parsing

在每个5,000个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 个答案:

答案 0 :(得分:1)

您的意思是第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运行它。