1

我想从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
        )

)       

那么我该如何解决呢?这里有什么问题?

4

1 回答 1

2

您正在使用 ( @) 运算符抑制错误,因此您没有注意到 URL 实际上是不正确的。

调用应该是:

@$dom2->loadHTMLFile('http://en.advisor.travel/poi/' . $i);

在下面,您有以下内容:

$data[name] = $xpath2->query("//h1");

此行(以及下面的两行)有两处错误:

  • 您正在使用常量作为键。你应该用单引号括起来。
  • 即使纠正了上述错误,您也只能获得for循环最后一次迭代的值。要正确地将元素推送到$data数组中,您必须使用$data['key'][]语法。

您将不得不访问该 XPath 节点的 textContent,而不是简单地查询 XPath。为此,您可以使用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,我认为这不是一个好主意,因此不推荐它。

于 2013-11-03T23:05:25.113 回答