2010-10-15 107 views
0

在每个5,000个HTML文件中,我只能得到一行文本,即999行。如何告诉HTML :: Parser我只需要获取999行?如何解析HTML文件的一部分并忽略其余部分?

</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砖 - 我有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; 

BTW; 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运行的模板。

爱得到提示

+0

可能重复[xpather针对HTML文件运行:定义准备解析器的路径 - 作业运行Perl的HTML :: TokePaser](http://stackoverflow.com/questions/3949091/xpather-running-against-html -files-definitions-the-paths-to-prepare-a-parser-job-ru) – 2010-10-16 14:10:07

+0

该HTML的哪一行是你想要提取的那一行,或者是全部在一行上? – 2010-10-16 19:20:31

回答

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运行它。

+0

使用HTML :: TreeBuilder :: XPath; my $ tree = HTML :: TreeBuilder :: XPath-> new; #在此处使用真实文件名称 open(my $ fh,“<”,“file.html”)或die $ !; $ tree-> parse_file($ fh);我的$($ name)= $ tree-> findnodes(qq {/ html/body/table/tr [1]/td [2]}); print $ name-> as_text; 示例网站: 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文件 - – zero 2010-10-16 09:40:32

+0

Hello RedGrittyBrick:猜猜我现在明白了你的代码。你用这种颜色做了诡计! YOu使用灰色阴影色来解决问题!这是真的!?做得好!我不知所措。恭喜。问候Martin – zero 2010-10-16 17:19:03

+1

如果您要显示代码,请更新您的问题。强制人们在评论中阅读代码是残酷的。 – 2010-10-16 19:17:52