1

コンテンツが CC である advisor.travel Web サイトから場所の名前と座標を取得したいので、名前と座標が記載された最初の 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");

この行 (および以下の 2 行) には 2 つの問題があります。

  • 定数をキーとして使用しています。一重引用符で囲む必要があります。
  • 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>';

?>

技術的にはこれでうまくいくはずですが、照会する URL が 12 個あるため、これは良い考えではないと思います。したがって、お勧めしません。

于 2013-11-03T23:05:25.113 に答える