使用HTML :: TokeParser

时间:2016-11-05 09:06:02

标签: perl html-parsing

  

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

以下是我的代码中的一个片段,它使用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";
}
  

上面的代码段从给定的html页面中提取所有链接。这将在循环中与url哈希一起使用,以抓取给定域中的所有页面。

下面是另一个与第一个几乎完全相同的代码段,除了我尝试提取 audio代码 而不是 {{1} } tags:

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"; } 个标签。我有什么遗失的东西吗?

  

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

请考虑以下标记:

audio

我想解析整个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> 代码的src属性。因此,如果html看起来像这样:

audio

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

<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

  

所以我需要解析html文件,只提取每个http://www.example.com/mp3/Some%20Mp3%20File%204.mp3标签的src属性。

1 个答案:

答案 0 :(得分:3)

我不熟悉HTML :: Token但来自Mojo::DOMMojolicious可用于使用熟悉的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结合使用。