2013-06-20 79 views
-2

我一直在使用preg_match从HTML文件中抓取URL,但我只想提取以.mp3作为扩展名的网址。我被告知尝试DOM,我一直在尝试修复代码,但它不起作用。无论我做什么,我都会得到一个空白页。刮去HTML中的链接

我在做什么错?

<?php 
    $url = 'http://www.mp3olimp.net/miley-cyrus-when-i-look-at-you/'; 
    $html = @file_get_html($url); 
    $dom = new DOMDocument(); 
    $doc->loadHTML($html); 
    $xpath = new DOMXPath($doc); 
    $links = $xpath->query('//a[ends-with(@href, ".mp3")]/@href'); 

    echo $links; 
?> 
+0

print_r($ links)会发生什么,而不是echo? –

+0

@MalcolmDiggs结果是一样的,空白页 – andrew

+1

那么我要做的第一件事就是从@file_get_html中删除@符号。在添加@之前,您只需要抑制错误,但在这种情况下,您希望查看错误,因此您最好将其删除,并让脚本告诉您发生了什么问题。 –

回答

4

有几个问题!

  • 如上所述,请在file_get_html()之前删除@以查看错误。
  • file_get_contents($url)将工作以获取HTML内容。
  • Typo,$dom =应该是$doc =
  • 另一个恼人的问题是,HTML源代码格式不正确,导致后来的错误。
  • ends-with()仅在XPath 2.0中受支持,PHP使用XPath 1.0。所以你必须找到另一种方法来检查结尾。一些正则表达式应该能够做到这一点。
+0

请务必使用正确的代码格式使答案更易于阅读。 – TimWolla

+1

感谢您的支持!进入这整个StackOverflow的事情。很长的时间读者,第一次海报(老生常谈,我知道)。 –

+0

不客气。确保阅读[help](http://stackoverflow.com/help)并查看编辑器为您提供的选项。这样,写出一些很好的答案并获得声誉应该很容易。 – TimWolla

0
$input = file_get_contents($url);  
$regexp = "<a\s[^>]*href=(\"??)([^\" >]*?.mp3)\\1[^>]*>(.*)<\/a>"; 
if(preg_match_all("/$regexp/siU", $input, $matches, PREG_SET_ORDER)) { 
    foreach($matches as $match) { 
    // $match[2] = link address 
    // $match[3] = link text 
    } 
}