PHP从网站上抓取数据

时间:2016-03-25 08:41:09

标签: php

我是编程新手。所以我选择使用Wordpress构建一个网页。但我正在尝试从其他网站收集天气数据,我找不到适合抓取数据的插件,并决定试一试并自己整理一些东西。 但由于我对编程的理解有限,这给了我一些问题。通过网络上的一些灵感,我把它们放在一起:

$html = file_get_contents('http://www.frederikshavnhavn.dk/scripts/weatherwindow.php?langid=2'); //get the html returned from the following url

$poke_doc = new DOMDocument();

libxml_use_internal_errors(false); //disable libxml errors

if(!empty($html)){ //if any html is actually returned

  $poke_doc->loadHTML($html);
  libxml_clear_errors(); //remove errors for yucky html

  $poke_xpath = new DOMXPath($poke_doc);

  //get all the spans's with an id
  $poke_type = $poke_xpath->query("//span[@class='weathstattype']");
  $poke_text = $poke_xpath->query("//span[@class='weathstattext']");

  foreach($poke_text as $text){ 
    foreach($poke_type as $type){
    echo $type->nodeValue;
    echo $text->nodeValue . "</br>";
    continue 2;
   } 
  break;
 }    
} 

因为这对我来说是全新的,我真的想让这个为我工作,希望能更好地理解作品背后的代码。

我想要实现的是带有数据的格式化列表。 1. value $ type $ text 2.值$ type $ text

现在它给我带来了很多麻烦。 当我使用continue 2时,它不会更改值$ type,但是当我只使用continue语句时,它会更改$ type但不会更改$ text。我怎样才能让它每次都改变这两个值?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

尝试添加此方法:

function get_inner_html( $node ) {
    $innerHTML= '';
    $children = $node->childNodes;
    foreach ($children as $child) {
        $innerHTML .= $child->ownerDocument->saveXML( $child );
    }

    return $innerHTML;
} 

然后用这个替换foreach:

  foreach($poke_text as $text){ 
     //echo $type ->nodeValue . "</n>";
      echo get_inner_html($text ).'<br>';

  }  
    foreach($poke_type as $type){
     //echo $text ->nodeValue;
     echo get_inner_html($type ).'<br>';
  }

产生这个:

  1. 197°(Syd) 5.7°C Stigende 4.8米/秒的Stigende 5.4米/秒的Stigende -6厘米Faldende 1004 hPa Vindretning Lufttemperatur Middel vindhastighed Max vindhastighed Vandstand Lufttryk

答案 1 :(得分:0)

你的代码中的伙伴你的foreach循环(在最后)你使用$ type作为$ text和$ text作为$ type ..我运行代码只是改变变量,因为它们应该是它的工作正常..

$html = file_get_contents('http://www.frederikshavnhavn.dk/scripts/weatherwindow.php?langid=2'); //get the html returned from the following url

$poke_doc = new DOMDocument();

libxml_use_internal_errors(false); //disable libxml errors

if(!empty($html)){ //if any html is actually returned

  $poke_doc->loadHTML($html);
  libxml_clear_errors(); //remove errors for yucky html

  $poke_xpath = new DOMXPath($poke_doc);

  //get all the spans's with an id
  $poke_type = $poke_xpath->query("//span[@class='weathstattype']");

  $poke_text = $poke_xpath->query("//span[@class='weathstattext']");

  foreach($poke_text as $text){ 
     echo $text->nodeValue;
  }  
    foreach($poke_type as $type){
     echo $type->nodeValue;
  }
}

这就是我从你的代码中获得的(通过改变循环中的变量)

  

196°(Syd)5.6°C 4.1 m / s 5 m / s -6 cm 1004 hPa Vindretning Lufttemperatur Middel vindhastighed Max vindhastighed Vandstand Lufttryk

现在您拥有自己的数据我认为您可以管理如何对它们进行排序......