【问题标题】:Good practice parsing specific html table with urls in perl在 perl 中使用 url 解析特定 html 表的好习惯
【发布时间】:2012-02-21 20:23:42
【问题描述】:

给定一个带有如下表格数据的 html...

<tr class=nbg1><td><A HREF=api.dll?pgm=cdq32&p1=oavmsd&p2=fg3m9s5d&p3=&cmd=w1d27d0id9654&hl=antibio&lstid=026>Nadifloxacin</A></td><td>Aknetherapeutikum Antibiotikum (Gyrasehemmer)</td><td>WST</td><td></td></tr>
<tr class=nbg2><td><A HREF=api.dll?pgm=cdq32&p1=oavmsd&p2=fg3m9s5d&p3=&cmd=w1d27d0id9728&hl=antibio&lstid=026>Ertapenem</A></td><td>Antibiotikum</td><td>WST</td><td></td></tr>
<tr class=nbg1><td><A HREF=api.dll?pgm=cdq32&p1=oavmsd&p2=fg3m9s5d&p3=&cmd=w1d27d0id9761&hl=antibio&lstid=026>Panipenem</A></td><td>Beta-Lactam-Antibiotikum</td><td>WST</td><td></td></tr>
<tr class=nbg2><td><A HREF=api.dll?pgm=cdq32&p1=oavmsd&p2=fg3m9s5d&p3=&cmd=w1d27d0id10302&hl=antibio&lstid=026>Prulifloxacin</A></td><td>Antibiotikum (Gyrasehemmer)</td><td>WST</td><td></td></tr>
</table></td>
<td width=15></td><td valign=top nowrap class=NBG1>
<TABLE width="200" border="0" cellspacing="0" cellpadding="2">
<TR><TD CLASS="NBG2">
</TD></TR></TABLE><BR>

我需要解析 url 和 url 描述,其中提取的 url 将用于进一步解析子页面。什么是完成此任务的好习惯,尤其是获取 url。

当前代码:

my $te = HTML::TableExtract->new( depth => 3, count => 0 ); 
$te->parse($mainpage); 
my $ts = ""; 
my $row = ""; 
foreach $ts ($te->tables) { 
   foreach $row ($ts->rows) { 
      print @$row[0] . "\n"; 
   } 
}

【问题讨论】:

    标签: perl html-table html-parsing


    【解决方案1】:

    HTML::TableExtract 可以帮助您准确处理表格。

    【讨论】:

    • 我需要将“api.dll?pgm=cdq32&p1=oavmsd&p2=fg3m...”放入变量中
    【解决方案2】:

    如果您只想从该表中的每个 a' 元素中提取 href 属性,则无需使用 TableExtract,只需使用 HTML::Query

    my $qry = HTML::Query->new(text => $mainpage);
    
    
    my @hrefs = map { $_->attr('href') } grep { m/api\.dll/i } $qry->query('tr > td > a')->get_elements();
    

    没有经过测试,但你明白了......

    【讨论】:

    • 当然,但是 HTML::Query 在 Debian 5 的默认存储库中不可用,它将是另一个模块(开销)。所有解决方案都不是一个模块吗?只需要url和url描述。
    • 为什么需要默认回购?我确定它在 ubuntu repo 上也不可用,只需使用 CPAN 安装模块或 cpanm。
    • P.S:关于模块开销,Perl 完全是关于 CPAN,这是它的优势关键(除其他外,但这是主要的)。如果您不想使用模块,请使用全局匹配 (m//g) 正则表达式来匹配所有 url 及其描述,因为我似乎所有这些 url 具有相同的格式。
    • HTML::Query 对我来说看起来很具体
    猜你喜欢
    • 2011-07-05
    • 2012-10-06
    • 1970-01-01
    • 2010-11-11
    • 2020-04-21
    • 2015-07-02
    • 2014-07-18
    • 2011-10-10
    相关资源
    最近更新 更多