我正在使用一些简单的PHP从网站上抓取信息以允许离线阅读。代码似乎工作正常,但我担心未定义的行为。该网站编码有点差,我抓住的一些元素与另一个元素共享相同的id。我想,getElementById从上到下遍历DOM,我没有问题的原因是因为我需要的元素是带有id的第一个实例。有没有办法确保这种行为?该元素没有其他区分它的真实方法,因此通过id选择它似乎是最好的选择。我在下面列出了我正在使用的代码的剥离示例。
感谢。
<?php
$curl_referer = "http://example.com/";
$curl_url = "http://example.com/content.php";
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, 'Scraper/0.9');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_REFERER, "$curl_referer");
curl_setopt($ch, CURLOPT_URL, "$curl_url");
$output = curl_exec($ch);
$dom = new DOMDocument();
@$dom->loadHTML($output);
$content = $dom->getElementById('content');
echo $content->nodeValue;
?>
答案 0 :(得分:3)
尝试使用XPath表达式获取第一个包含id。
像那样://*[@id="content"][1]
PHP代码就是这样:
$xpath = new DOMXPath($dom);
$xpath->query('//*[@id="content"][1]')->item(0)->nodeValue;
提示:使用libxml_use_internal_errors(true)
,您可以捕获后者进行日志记录或尝试整理文档。
修改
嘿,在您的代码中,您将UA设置为“Scraper / 0.9”,大多数编写错误网站的人都不会查看它并且不会在其页面中记录传入的请求,但是,我不建议像这样放UA,只需要放一个浏览器UA,就像chrome的用户代理一样,因为如果他们正在监控并看到包含这个用户代理的请求,他们将把你(未来)列入黑名单。