通过get_file_contents()解析html

时间:2011-11-25 19:38:29

标签: php parsing dom screen-scraping

已被告知解析html的最佳方法是通过DOM这样:

<?

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

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


?>

但是在上面变量$ html不能是一个url,还是可以呢? 我不得不使用函数get_file_contents()来获取页面的html?

3 个答案:

答案 0 :(得分:1)

您必须使用DOMDocument::loadHTMLFile从网址加载HTML。

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

DOMDocument::loadHTML解析一串HTML。

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

答案 1 :(得分:0)

它可以,但它取决于在PHP安装中启用allow_url_fopen。基本上所有基于PHP文件的函数都可以接受URL作为源(或目标)。这样的URL是否有意义取决于您要做的事情。

e.g。执行file_put_contents('http://google.com')无法正常工作,因为您尝试将HTTP上传到谷歌,并且他们不会允许您更换其主页...

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

答案 2 :(得分: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];

脚本应抓取<span class=comment></span>之间的文本并存储在数组$match中。这应该回应Entertainment