使用xpath抓取文本内容

时间:2013-11-03 22:40:37

标签: php html dom xpath for-loop

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

)       

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

1 个答案:

答案 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需要查询,我认为这不是一个好主意,因此不推荐它。