【问题标题】:Parse Html Audio Tag Using HTML::TokeParser使用 HTML::TokeParser 解析 Html 音频标签
【发布时间】:2017-03-19 02:27:26
【问题描述】:

我正在尝试在 perl 中编写一个 spider,它将解析域中的所有音频标签并尝试从找到的每个音频标签下载相应的 audio/mpeg 内容。

下面是我的代码中的一个 sn-p,它使用 HTML::TokeParser 解析 html 以便从 a 标签中提取链接:

my($response, $base, $stream, $pageURL, $tag, $url);

$response = 'http://example.com/page-with-some-audio-content';
$base = URI->new( $response->base )->canonical;

$stream = HTML::TokeParser->new( $response->content_ref );
$pageURL = URI->new( $response->request->uri );

while($tag = $stream->get_tag('a')) {
    next unless defined($url = $tag->[1]{'href'});
    print $url."\n";
}

上面的代码 sn-p 从给定的 html 页面中提取所有链接。这与 url 散列一起用于循环中,以抓取给定域中的所有页面。

下面是另一个 sn-p 几乎与第一个相同,只是我试图提取 audio 标签 而不是 a 标签:

my($response, $base, $stream, $pageURL, $tag, $url);

$response = 'http://example.com/page-with-some-audio-content';
$base = URI->new( $response->base )->canonical;

$stream = HTML::TokeParser->new( $response->content_ref );
$pageURL = URI->new( $response->request->uri );

while($tag = $stream->get_tag('audio')) {
    next unless defined($url = $tag->[1]{'onplaying'});
    print $url."\n";
}

由于某种原因,没有检测到 audio 标记。有什么我遗漏的吗?


阅读HTML::TokeParser 文档,我发现我无法提取嵌套 html 元素的属性。

考虑下面的这个标记:

<audio onplaying="podPress_html5_count('http://www.example.com/mp3/Some Mp3 File.mp3', this.id)">
   <source src="http://www.example.com/mp3/Some%20Mp3%20File.mp3">
</audio>

我想解析整个 html 以仅提取找到的所有 audio 标记的 src 属性。因此,如果 html 看起来像这样:

  <body>

    <audio onplaying="podPress_html5_count('http://www.example.com/mp3/Some Mp3 File.mp3', this.id)">
      <source src="http://www.example.com/mp3/Some%20Mp3%20File.mp3">
    </audio>

    <audio onplaying="podPress_html5_count('http://www.example.com/mp3/Some Mp3 File 2.mp3', this.id)">
      <source src="http://www.example.com/mp3/Some%20Mp3%20File%202.mp3">
    </audio>

    <audio onplaying="podPress_html5_count('http://www.example.com/mp3/Some Mp3 File 3.mp3', this.id)">
      <source src="http://www.example.com/mp3/Some%20Mp3%20File%203.mp3">
    </audio>
    <audio onplaying="podPress_html5_count('http://www.example.com/mp3/Some Mp3 File 4.mp3', this.id)">
      <source src="http://www.example.com/mp3/Some%20Mp3%20File%204.mp3">
    </audio>

  </body>

预期的输出应该是这样的:

http://www.example.com/mp3/Some%20Mp3%20File.mp3 http://www.example.com/mp3/Some%20Mp3%20File%202.mp3 http://www.example.com/mp3/Some%20Mp3%20File%203.mp3 http://www.example.com/mp3/Some%20Mp3%20File%204.mp3

所以我需要解析 html 文件以仅提取每个存在的 audio 标记的 src 属性。

【问题讨论】:

  • 我担心这个模块不支持 HTML5。
  • @choroba noooohh!!!!!那有什么选择?? X(

标签: perl html-parsing


【解决方案1】:

我不熟悉 HTML::Token,但 Mojo::DOM 来自 Mojolicious 可用于通过熟悉的 CSS 语法轻松查找和提取链接:

use Mojo::DOM;
my $html = '<body> ... ';
my $dom = Mojo::DOM->new($html);
my @src = map { $_->{src} }
    $dom->find('audio[onplaying] source[src]')->each;

如果您需要从网络中获取 HTML 文件或音频文件,您也可以将其与 Mojo::UserAgent 结合使用。

【讨论】:

  • 所以@src 数组应该包含所有音频标签的src 属性?
  • @atefth:完全正确。你的例子对我有用。
猜你喜欢
  • 2013-09-18
  • 2016-02-18
  • 1970-01-01
  • 2014-01-14
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
相关资源
最近更新 更多