<?php
$ch = curl_init("http://www.alibaba.com/showroom/black-and-white-wedding-dresses.html");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
$html = curl_exec($ch);
curl_close($ch);
$dom = new DOMDocument;
$dom->strictErrorChecking = false;
@$dom->loadHTML($html);
$xpath = new DOMXpath($dom);
$description = $xpath->query('//meta[@name="description"]/@content');
foreach ($description as $n) {
echo $n->nodeValue ;
}
?>
没有返回..使用其他网址,它可以正常工作。 可能是什么问题?
答案 0 :(得分:2)
您的XPath表达式很好。该站点正在执行用户代理检测并返回HTTP 302响应,其位置设置为请求的IP地址。将其转储到文件中以查看。
如果添加用户代理标头来模仿桌面浏览器,请求将会完成并且一切都将按预期工作。
$ch = curl_init("http://www.alibaba.com/showroom/black-and-white-wedding-dresses.html");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:13.0) Gecko/20100101 Firefox/13.0.1');
$html = curl_exec($ch);
curl_close($ch);
$dom = new DOMDocument;
$dom->strictErrorChecking = false;
@$dom->loadHTML($html);
$xpath = new DOMXpath($dom);
$description = $xpath->query('//meta[@name="description"]/@content');
foreach ($description as $n) {
echo $n->nodeValue ;
}
输出:
Black And White Wedding Dresses, You Can Buy Various High Quality Black And White Wedding Dresses Products from Global Black And White Wedding Dresses Suppliers and Black And White Wedding Dresses Manufacturers at Alibaba.com
答案 1 :(得分:0)
当我在Safari或Chrome中的DOM检查器中检查该页面时,它表示<meta>
元素(以及所有元素)位于XHTML命名空间(URI为http://www.w3.org/1999/xhtml
的命名空间) 。我不知道为什么他们会在该命名空间中(原始标记没有指定它们在该命名空间中,AFAICT),但它可以解释为什么你的XPath表达式不能选择它们:它要求没有命名空间中的元元素。
要解决此问题,请使用此解决方法:
$description = $xpath->query('//*[local-name() = 'meta' and
@name="description"]/@content');
无论他们在哪个命名空间,都会找到元素。
或者,为了提高效率,创建一个命名空间解析器,其中xhtml
前缀绑定到xhtml命名空间URI,然后将此命名空间解析器与表达式
$description = $xpath->query('//xhtml:meta[@name="description"]/@content');
但后者仅适用于meta
元素位于XHTML名称空间中的网页。