2010-10-15 108 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