2011-11-25 53 views
0

时已被告知,解析HTML的最佳方式是通过DOM这样的:解析HTML

<? 

$html = "<span>Text</span>"; 
$doc = new DOMDocument(); 
$doc->loadHTML($html); 

$elements = $doc->getElementsByTagName("span"); 
foreach($elements as $el) 
{ 
    echo $el->nodeValue . "\n"; 
} 


?> 

但在上述变量$ HTML不能是一个网址,也可以它?? 难道不我必须使用的功能get_file_contents()来获取一个网页的HTML?

回答

0

它可以是,但它取决于你的PHP安装了allow_url_fopen被启用。基本上所有的基于PHP文件的函数都可以接受一个URL作为源(或目的地)。这样的URL是否有意义取决于你想要做什么。

例如做file_put_contents('http://google.com')不会工作,因为你会试图做一个HTTP上传到谷歌,他们不会让你更换他们的主页...

但做$dom->loadHTML('http://google.com');会工作,并会吸在谷歌的主页上进行DOM处理。

+0

好吧,我用网址替换了$ html,但它仍然没有反馈标签? – Shawn

+1

PHP DOM是相当挑剔的HTML语法,甚至略有畸形的HTML将导致其窒息。在加载远程文档时,可能想打开错误/警告显示并查看是否有任何内容显示。 –

0

如果您在使用DOM遇到问题,你可以使用CURL解析。例如:

$url = "http://www.davesdaily.com/"; 

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($curl, CURLOPT_URL, $url); 
$input = curl_exec($curl); 

$regexp = "<span class=comment>([^<]*)<\/span>"; 
if(preg_match_all("/$regexp/siU", $input, $matches, PREG_SET_ORDER)) { 
    foreach($matches as $match); 
} 
    echo $match[0]; 

脚本应该抓住阵列$match内部<span class=comment></span>和商店之间的文本。这应该回显Entertainment

1

你必须使用DOMDocument::loadHTMLFile从一个URL加载HTML。

$doc = new DOMDocument(); 
$doc->loadHTMLFile($path); 

DOMDocument::loadHTML解析一个HTML字符串。

$doc = new DOMDocument(); 
$doc->loadHTML(file_get_contents($path));