2016-11-05 9 views
1

私は、ドメイン内のすべてのオーディオタグを解析し、発見された各オーディオタグからそれぞれaudio/mpegコンテンツをダウンロードしようとPerlでクモを記述しようとしています。以下はHTMLを使用して解析HTML形式のオーディオタグに:: TokeParser

aタグからリンクを抽出するためにHTMLを解析するHTML::TokeParserを使用して私のコードからの抜粋です:

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のハッシュと共に使用され、特定のドメイン内のすべてのページをクロールします。以下は

別のスニペットは、ほぼ完全に私が代わりにaタグのaudioタグを抽出しようとしていることを除いて、第1と同じである。いくつかの理由

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要素の属性を抽出することができないことを理解HTML::TokeParserドキュメントを読ん


以下、このマークアップを考えてみましょう:

<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タグの唯一のsrc属性を抽出するために、全体のHTMLを解析します。 HTMLはこのようなものに見えた場合したがって、:だから私はhtmlファイルを解析する必要が

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

<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> 

を期待される出力は次のようにする必要があります各audioタグの属性のうちsrcのみを抽出します。

+0

私はモジュールがHTML5をサポートしないことを恐れています。 – choroba

+0

@choroba noooohh !!!!!オプションは何ですか? X( – atefth

答えて

3

私はHTML ::トークンに慣れていないんだけどMojoliciousからMojo::DOMが簡単に身近なCSSの構文を使用してリンクを見つけて抽出するために使用することができます。

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

そして、あなたはまた、でこれを組み合わせることができますMojo::UserAgentネットワークからHTMLファイルまたはオーディオファイルを取得する必要がある場合。

+0

) '@ src'配列はすべてのオーディオタグの' src'属性を保持することになっていますか? – atefth

+1

@atefth: –

関連する問題