首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >HTML::TokeParser -在标记之间和之后查找文本

HTML::TokeParser -在标记之间和之后查找文本
EN

Stack Overflow用户
提问于 2014-02-17 09:44:57
回答 2查看 251关注 0票数 3

我试图使用以下代码从HTML页面中提取以下文本,但我的代码失败了。

预算-25 000 000美元

毛额(全世界)-58 500 000美元

代码语言:javascript
运行
复制
#!/usr/bin/perl
use HTML::TokeParser;

my $content = <<HTML;
<h5>Budget</h5>
$25,000,000 (estimated)<br/>
<br/>

<h5>Opening Weekend</h5>
$727,327 (USA) (<a href="/date/09-25/">25 September</a> <a href="/year/1994/">1994</a>) (33 Screens)<br/>
<br/>

<h5>Gross</h5>
$28,341,469 (USA) (<a href="/date/08-05/">5 August</a> <a href="/year/2012/">2012</a>)<br/>&#163;2,344,349 (UK) (<a href="/date/05-18/">18 May</a> <a href="/year/1995/">1995</a>)<br/>&#163;1,732,123 (UK) (<a href="/date/04-16/">16 April</a> <a href="/year/1995/">1995</a>)<br/>$58,500,000 (Worldwide)<br/>$555,480 (Belgium)<br/>ESP 637,291,985 (Spain)<br/>
<br/>

<h5>Admissions</h5>
82,890 (Belgium)<br/>163,594 (France) (<a href="/date/03-28/">28 March</a> <a href="/year/1995/">1995</a>)<br/>410,811 (Germany) (<a href="/date/12-31/">31 December</a> <a href="/year/1995/">1995</a>)<br/>1,245,604 (Spain)<br/>
<br/>

<h5>Filming Dates</h5>
<a href="/date/06-16/">16 June</a> <a href="/year/1993/">1993</a>&nbsp;-&nbsp;<a href="/date/09-10/">10 September</a> <a href="/year/1993/">1993</a><br/>
<br/>
HTML

my $description = "";
my $tp = HTML::TokeParser->new(\$content) || die "Can't open: $!";

while (my $token = $tp->get_tag("h5")) {
    my $text = $parser->get_text();
    last if $text =~ /budget/i;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-17 14:16:57

这可能不是最优雅的解决方案,但它有效。

代码语言:javascript
运行
复制
while (my $token = $tp->get_tag("h5")) {
    my $heading = $tp->get_text();
    $tp->get_tag("/h5");
    my $amount = $tp->get_trimmed_text =~ s/[^\d,\$]//gr;
    next unless $amount =~ m/\d/;
    say qq{$heading - $amount};
}

根据HTML::TokeParser docs,您可以使用get_tag获得开始和结束标记。在start <h5>之后,我们可以获取标题,然后转到结束的</h5>。它后面有一个文本节点,其中包含货币值。

票数 0
EN

Stack Overflow用户

发布于 2014-02-17 11:03:59

使用regexps也是可能的。

代码语言:javascript
运行
复制
while ( $content =~ s!<h5[^>]*>\s*(.+?)\s*</h5>\s*(\S+)(.*?)<br[^>]*>!!is ){
  my $h5text = $1;
  my $amount = $2;
  my $rest   = $3;
  if ($h5text =~ m!(Budget|Gross)!is){
     print "$h5text\t$amount\n";
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21825549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档