我想从advisor.travel网站获取地点的名称和坐标,其内容为CC,所以我只需要前10页的名称和坐标......
链接到景点的链接格式为:http://en.advisor.travel/poi/1
所以'http://en.advisor.travel/poi/'.i
其中i
是吸引人数
我想只获得前10个景点所以我在1和10之间,xpath为名称
//h1 tag
和坐标的xpath是:
//span[@class='latitude']
//span[@class='longitude']
我现在创建一个刮刀,代码是:
<?php
for ($i=0; $i<=10; $i++)
{
$dom2 = new DOMDocument();
@$dom2->loadHTMLFile('http://en.advisor.travel' . $i);
$xpath2 = new DOMXPath($dom2);
$data = array();
$data[name] = $xpath2->query("//h1");
$data[latitude] = $xpath2->query("//span[@class='latitude']");
$data[longitude] = $xpath2->query("//span[@class='longitude']");
}
echo '<pre>' . print_r($data, true) . '</pre>';
?>
但是这个结果代码只给我这个:
Array
(
[name] => DOMNodeList Object
(
[length] => 0
)
[latitude] => DOMNodeList Object
(
[length] => 0
)
[longitude] => DOMNodeList Object
(
[length] => 0
)
)
那么我该如何解决呢?这有什么问题?
答案 0 :(得分:2)
您使用(@
)运算符来抑制错误,因此您没有注意到该URL实际上是错误的。
电话应该是:
@$dom2->loadHTMLFile('http://en.advisor.travel/poi/' . $i);
在下面,您有以下内容:
$data[name] = $xpath2->query("//h1");
这一行有两个问题(下面两行):
for
循环的最后一次迭代的值。要将元素正确地推送到$data
数组中,您必须使用$data['key'][]
语法。您不必简单地查询XPath,而是访问该XPath节点的textContent。为此,您可以使用textContent()
:
$data['name'][] = $xpath2->query("//h1")->item(0)->textContent;
$data['latitude'][] = $xpath2->query("//span[@class='latitude']")
->item(0)->textContent;
$data['longitude'][] = $xpath2->query("//span[@class='longitude']")
->item(0)->textContent;
完整代码应如下所示:
<?php
for ($i=0; $i<=12; $i++)
{
$dom2 = new DOMDocument();
@$dom2->loadHTMLFile('http://en.advisor.travel/poi/' . $i);
$xpath2 = new DOMXPath($dom2);
$data = array();
$data['title'][] = $xpath2->query("//h1")->item(0)->textContent;
$data['latitude'][] = $xpath2->query("//span[@class='latitude']")->item(0)->textContent;
$data['longitude'][] = $xpath2->query("//span[@class='longitude']")->item(0)->textContent;
echo "<hr/>";
}
echo '<pre>' . print_r($data, true) . '</pre>';
?>
从技术上讲,这应该可行,但由于有12个不同的URL需要查询,我认为这不是一个好主意,因此不推荐它。