解析URL的网站

时间:2010-12-16 13:14:46

标签: php html parsing html-parsing

只是想知道是否有人可以通过以下方式帮助我。我想解析这个网站上的URL:http://www.directorycritic.com/free-directory-list.html?pg = 1& sort = pr

我有以下代码:

<?PHP  
$url = "http://www.directorycritic.com/free-directory-list.html?pg=1&sort=pr";
$input = @file_get_contents($url) or die("Could not access file: $url"); 
$regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>"; 
if(preg_match_all("/$regexp/siU", $input, $matches)) { 
// $matches[2] = array of link addresses 
// $matches[3] = array of link text - including HTML code
} 
?>

目前没有做什么,我需要做的是废弃所有16页的表格中的所有URL,并且非常感谢如何修改上述内容以及将URL输出到文本文件中的一些帮助。

3 个答案:

答案 0 :(得分:5)

使用HTML Dom Parser

$html = file_get_html('http://www.example.com/');

// Find all links
$links = array(); 
foreach($html->find('a') as $element) 
       $links[] = $element->href;

现在,links数组包含给定页面的所有URL,您可以使用这些URL进一步解析。

使用正则表达式解析HTML并不是一个好主意。以下是一些相关帖子:

修改

以下评论中Gordon所述的其他一些HTML解析工具:

答案 1 :(得分:3)

你真的不应该使用正则表达式解析HTML,因为它容易出错。

更好地使用像PHP’s DOM library

之类的HTML解析器
$code = file_get_contents($url);
$doc = new DOMDocument();
$doc->loadHTML($code);
$links = array();
foreach ($doc->getElementsByTagName('a') as $element) {
    if ($element->hasAttribute('href')) {
        $links[] = $elements->getAttribute('href');
    }
}

请注意,这将收集文档中出现的URI引用,而不是绝对URI。您可能希望之前解决它们。

似乎PHP没有提供合适的库(或者我还没有找到它)。但请参阅RFC 3986 – Reference Resolutionmy answer on Convert a relative URL to an absolute URL with Simple HTML DOM?了解更多详情。

答案 2 :(得分:0)

尝试此方法

function getinboundLinks($domain_name) {
ini_set('user_agent', 'NameOfAgent (<a class="linkclass" href="http://localhost">http://localhost</a>)');
 $url = $domain_name;
$url_without_www=str_replace('http://','',$url);
$url_without_www=str_replace('www.','',$url_without_www);
 $url_without_www= str_replace(strstr($url_without_www,'/'),'',$url_without_www);
$url_without_www=trim($url_without_www);
$input = @file_get_contents($url) or die('Could not access file: $url');
 $regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>";
//$inbound=0;
$outbound=0;
$nonfollow=0;
if(preg_match_all("/$regexp/siU", $input, $matches, PREG_SET_ORDER)) {
foreach($matches as $match) {
# $match[2] = link address
 # $match[3] = link text
//echo $match[3].'<br>';
if(!empty($match[2]) && !empty($match[3])) {
if(strstr(strtolower($match[2]),'URL:') || strstr(strtolower($match[2]),'url:') ) {
$nonfollow +=1;
} else if (strstr(strtolower($match[2]),$url_without_www) || !strstr(strtolower($match[2]),'http://')) {
     $inbound += 1;
    echo '<br>inbound '. $match[2];
 }
else if (!strstr(strtolower($match[2]),$url_without_www) && strstr(strtolower($match[2]),'http://')) {
echo '<br>outbound '. $match[2];
     $outbound += 1;
    }
}
}
}
$links['inbound']=$inbound;
$links['outbound']=$outbound;
$links['nonfollow']=$nonfollow;
return $links;
}

// ************************Usage********************************
$Domain='<a class="linkclass" href="http://zachbrowne.com">http://zachbrowne.com</a>';
$links=getinboundLinks($Domain);
echo '<br>Number of inbound Links '.$links['inbound'];
echo '<br>Number of outbound Links '.$links['outbound'];
echo '<br>Number of Nonfollow Links '.$links['nonfollow'];