【问题标题】:How can I parse only part of an HTML file and ignore the rest?如何仅解析 HTML 文件的一部分而忽略其余部分?
【发布时间】:2010-10-15 23:31:26
【问题描述】:

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

喜欢得到提示

【问题讨论】:

标签: perl html-parsing


【解决方案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 运行它。

【讨论】:

  • 使用 HTML::TreeBuilder::XPath;我的 $tree = HTML::TreeBuilder::XPath->new; #在此处使用真实文件名 open(my $fh, "parse_file($fh);我的 ($name) = $tree->findnodes(qq{/html/body/table/tr[1]/td[2]});打印 $name->as_text;示例站点:kultusportal-bw.de/servlet/PB/menu/1188427/… 在灰色阴影块中,您会看到想要的信息:需要的 17 行。注意 - 我有 5000 个 HTML 文件 -
  • Hello RedGrittyBrick:猜猜我现在理解你的代码了。你用颜色成功了!您解决了使用灰色阴影颜色的问题!这是真的!?很好!我不知所措。恭喜。问候马丁
  • 如果您要显示代码,请更新您的问题。强迫人们阅读 cmets 中的代码是残忍的。
  • 你好 brian d foy - 感谢发帖。我同意。作为一个新手,我必须学习很多! - 问候
  • @Martin,是的 - HTML 有几个表,因此指定一个表属性来唯一标识您感兴趣的表。我发现值得阅读有关 XPath 表达式的 W3C 教程。
猜你喜欢
  • 1970-01-01
  • 2010-10-31
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 2020-11-05
  • 1970-01-01
相关资源
最近更新 更多