我只有一个用于HTML解析的PHP脚本,它适用于简单的网站,但现在我需要解析来自this website的电影程序。我正在使用file_get_contents
函数,它只返回4个新的行分隔符\n
,我无法弄清楚原因。
使用DOMDocument XPath解析网站本身会比较困难,因为程序本身只是弹出窗口,似乎没有更改URL地址,但我会在检索网站的HTML代码后尝试处理这个问题
这是我的脚本的缩短版本:
<?php
$url = "http://www.cinemacity.cz/";
$content = file_get_contents($url);
$dom = new DomDocument;
$dom->loadHTML($content);
if ($dom == FALSE) {
echo "FAAAAIL\n";
}
$xpath = new DOMXPath($dom);
$tags = $xpath->query("/html");
foreach ($tags as $tag) {
var_dump(trim($tag->nodeValue));
}
?>
编辑:
所以,按照WBAR的建议(谢谢),我正在寻找一种方法来改变file_get_contents()函数中的标题,这是我在其他地方找到的答案。现在我能够获得该网站的HTML,希望我能管理这个混乱的解析:D
<?php
libxml_use_internal_errors(true);
// Create a stream
$opts = array(
'http'=>array(
'user_agent' => 'PHP libxml agent', //Wget 1.13.4
'method'=>"GET",
'header'=>"Accept-language: en\r\n" .
"Cookie: foo=bar\r\n"
)
);
$context = stream_context_create($opts);
// Open the file using the HTTP headers set above
$content = file_get_contents('http://www.cinemacity.cz/', false, $context);
$dom = new DomDocument;
$dom->loadHTML($content);
if ($dom == FALSE) {
echo "FAAAAIL\n";
}
$xpath = new DOMXPath($dom);
$tags = $xpath->query("/html");
foreach ($tags as $tag) {
var_dump(trim($tag->nodeValue));
}
?>
答案 0 :(得分:4)
问题不在PHP中,而在目标主机中。它检测客户端的User-Aget标头。看看这个:
wget http://www.cinemacity.cz/
2012-10-07 13:54:39 (1,44 MB/s) - saved `index.html.1' [234908]
但删除UserAget标题时:
wget --user-agent="" http://www.cinemacity.cz/
2012-10-07 13:55:41 (262 KB/s) - saved `index.html.2' [4/4]
服务器
仅返回4个字节答案 1 :(得分:0)
尝试以这种方式获取内容:
function get2url($url, $timeout = 30, $port = 80, $buffer = 128) {
$arr = parse_url($url);
if(count($arr) < 3) return "URL ERROR";
$ssl = "";
if($arr['scheme'] == "https") $ssl = "ssl://";
$header = "GET " . $arr['path'] . "?" . $arr['query'] . " HTTP/1.0\r\n";
$header .= "Host: " . $arr['host'] . "\r\n";
$header .= "\r\n";
$f = @fsockopen($ssl . $arr['host'], $port, $errno, $errstr, $timeout);
if(!$f)
return $errstr . " (" . $errno . ")";
else{
@fputs($f, $header . $arr['query']);
$echo = "";
while(!feof($f)) { $echo .= @fgets($f, $buffer); }
@fclose($f);
return $echo;
}
}
您必须删除标题。