HTML :: TableExtract:应用正确的属性来指定感兴趣的属性

时间:2010-10-21 20:22:25

标签: perl attributes html-parsing

我尝试在下面的HTML上运行以下Perl脚本。我的问题是如何定义正确的哈希引用,attribs指定我的HTML <table>标记本身中感兴趣的属性。

#!/usr/bin/perl

use strict; use warnings;
use HTML::TableExtract;
use YAML;


my $table = HTML::TableExtract->new(keep_html=>0, depth => 1, count => 1, br_translate => 0 ); 

$table->parse($html);
foreach my $row ($table->rows) 

sub cleanup {
    for ( @_ ) {
        s/\s+//;
        s/[\xa0 ]+\z//;
        s/\s+/ /g;
    }
}

{ print join("\t", @$row), "\n"; }

我想在下面进一步看到的HTML文档中应用此代码。

我的第一种方法是使用columns方法执行此操作。但是我无法弄清楚如何在下面的HTML文件中使用columns方法:我的直觉让我觉得它应该像下面这样(但我的直觉是错误的):

foreach my $column ($table->columns) { 
    print join("\t", @$column), "\n"; 
}

HTML::TableExtract文档并没有给我带来太多启示(无论如何)。

我可以在模块的代码中看到columns方法属于HTML::TableExtract::Table,但我无法弄清楚如何使用它。我感谢任何帮助。

背景

我尝试将表提取出来,并且我有一个非常小的表格文档,我想用HTML::TableExtract模块解析我试图在HTML中搜索关键字 - 这样我就可以使用它们对于attribs,我必须只打印必要的数据。

我尝试过CPAN,但无法真正找到如何搜索特定关键字。一种方法是HTML::TableExtract - 另一种方法是用HTML::TokeParser解析我对HTML::TokeParser的经验很少。

嗯 - 我需要执行此解析的一种或另一种方式:我想将解析后的表的结果输出到某些.text中 - 或者甚至更好地将其存储到数据库中。这里的问题是我无论如何都无法搜索生成的解析表并获得必要的数据。

HTML

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">

<link rel="stylesheet" href="jspsrc/css/bp_style.css" type="text/css">

<title>Weitere Schulinformationen</title>
</head>

<body class="bodyclass">
<div style="text-align:center;"><center>
<!-- <fieldset><legend> general information  </legend>
-->
<br/>

<table border="1" cellspacing="0" bordercolordark="white" bordercolorlight="black" width="80%" class='bp_result_tab_info'>
<!-- <table border="0" cellspacing="0" bordercolordark="white" bordercolorlight="black" width="80%" class='bp_search_info'>
-->  
  <tr>
    <td width="100%" colspan="2" class="ldstabTitel"><strong>data_one </strong></td>
  </tr>
  <tr>
    <td width="27%"><strong>data_two</strong></td>
    <td width="73%">&nbsp;116439
  </td>
  </tr>
  <tr>
    <td width="27%"><strong>official_description</strong></td>
    <td width="73%">the name </td>
  </tr>
  <tr>
    <td width="27%"><strong>name of the street</strong></td>
    <td width="73%">champs elysee</td>
  </tr>
  <tr>
    <td width="27%"><strong>number and town</strong></td>
    <td width="73%"> 75000 paris </td>
  </tr>
  <tr>
    <td width="27%"><strong>telefon</strong></td>

    <td width="73%">&nbsp;000241 49321
</td>
  </tr>
  <tr>
    <td width="27%"><strong>fax</strong></td>
    <td width="73%">&nbsp;000241 4093287
</td>
  </tr>
  <tr>
  <td width="27%"><strong>e-mail-adresse</strong></td>
  <td width="73%">&nbsp;<a href=mailto:1111116439@my_domain.org>1222216439@site.org</a>
</td>
  </tr>
  <tr>
    <td width="27%"><strong>internet-site</strong></td>
    <td width="73%">&nbsp;<a href=http://www.thesite.org>http://www.thesite.org</td>
 </tr>
<!--  
<tr>
    <td width="27%">&nbsp;</td>
    <td width="73%" align="right"><a href="schule_aeinfo.php?SNR=<? print $SCHULNR ?>" target="_blank">
    [Schuldaten &auml;ndern]&nbsp;&nbsp;</a>
</tr>
</td> -->
<tr>
  <td width="27%">&nbsp;</td>
  <td width="73%">the department</td>
 </tr> 

  <tr>
    <td width="100%" colspan=2><strong>&nbsp;</strong></td>
 </tr> 
 <tr>
    <td width="27%"><strong>number of indidviduals</strong></td>
    <td width="73%">&nbsp;192</td>
<tr>
    <td width="100%" colspan=2><strong>&nbsp;</strong></td>
   </tr>
  <!-- if (!fsp.isEmpty()){
 ztext = "&nbsp;";

 int i = 0;
 Iterator it = fsp.iterator();
 while (it.hasNext()){
  String[] zwert = new String[2];
  zwert = (String[])it.next();

  if (i==0){
   if (zwert[1].equals("0")){
    ztext = ztext+zwert[0];
   }else{
    ztext = ztext+zwert[0]+" mit "+zwert[1];
    if (zwert[1].equals("1")){
     ztext = ztext+" Sch&uuml;ler";
    }else{
     ztext = ztext+" Sch&uuml;lern";
    }
   } 
   i++;
  }else{
   if (zwert[1].equals("0")){
    ztext = ztext+"<br>&nbsp;"+zwert[0];
   }else{
    ztext = ztext+"<br>&nbsp;"+zwert[0]+" mit "+zwert[1];
    if (zwert[1].equals("1")){
     ztext = ztext+" Sch&uuml;ler";
    }else{
     ztext = ztext+" Sch&uuml;lern";
    }
   } 
  }  
 } 

-->





</table>
<!--  </fieldset>  -->
<br>

</body>
</html>

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您需要提供唯一标识相关表格的内容。这可以是其标题或HTML属性的内容。在这种情况下,文档中只有一个表,因此您甚至不需要这样做。但是,如果我要向构造函数提供任何内容,我将提供表的类。

另外,我认为你不想要表格的列。该表的第一列由标签组成,第二列由值组成。要同时获取标签和值,您应该逐行处理表。

#!/usr/bin/perl

use strict; use warnings;
use HTML::TableExtract;
use YAML;

my $te = HTML::TableExtract->new(
    attribs => { class => 'bp_result_tab_info' },
);

$te->parse_file('t.html');

for my $table ( $te->tables ) {
    print Dump $table->columns;
}

输出:

---
- 'data_one '
- data_two
- official_description
- name of the street
- number and town
- telefon
- fax
- e-mail-adresse
- internet-site
- á
- á
- number of indidviduals
- á
---
- ~
- "á116439\r\n  "
- 'the name '
- champs elysee
- ' 75000 paris '
- "á000241 49321\r\n"
- "á000241 4093287\r\n"
- "á1222216439@site.org\r\n"
- áhttp://www.thesite.org
- the department
- ~
- á192
- ~

最后,提出建议:很明显,您对Perl(或HTML)的理解并不多。最好先尝试学习一些基础知识。这样,你所做的就是错误地将代码从一个答案复制并粘贴到另一个答案而不学习任何东西。