Парсер для погоды

Алгоритмы, вопросы по синаксису, описание програмного обеспечения, администрирование серверов и т.д. и т.п.

Модератор: Модераторы

Ответить
Аватара пользователя
mase
ЗЛОЙ
Сообщения: 1987
Зарегистрирован: 02 фев 2011, 21:38
Контактная информация:

Парсер для погоды

Сообщение mase »

исходные данные:

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<weather created="rp5.ru" date="2012-2-29">
	<point id="2622">
		<point_id>2622</point_id>
		<region_id>27</region_id>
		<country_id>3</country_id>
		<point_name>Горно-Алтайск</point_name>
		<point_name_trim>Горно-Алтайск</point_name_trim>
		<point_name2>в Горно-Алтайске</point_name2>
		<point_timestamp>1330520361</point_timestamp>
		<gmt_add>7</gmt_add>
		<point_date>Wed, 29 Feb 2012 12:59:21 +0700</point_date>
		<point_date_time>2012-2-29 12:59 </point_date_time>
				<timestep>
					<time_step>12</time_step>
					<datetime>2012-2-29 19:00</datetime>
					<G>19</G>
					<HHii>19:00</HHii>
					<cloud_cover>0</cloud_cover>
					<precipitation>0.0</precipitation>
					<pressure>741</pressure>
					<temperature>-10</temperature>
					<humidity>74</humidity>
					<wind_direction>З</wind_direction>
					<wind_velocity>1</wind_velocity>
					<falls>0</falls>
					<drops>0</drops>
				</timestep>
				<timestep>
					<time_step>24</time_step>
					<datetime>2012-3-01 07:00</datetime>
					<G>7</G>
					<HHii>07:00</HHii>
					<cloud_cover>0</cloud_cover>
					<precipitation>0.0</precipitation>
					<pressure>743</pressure>
					<temperature>-19</temperature>
					<humidity>83</humidity>
					<wind_direction>В</wind_direction>
					<wind_velocity>2</wind_velocity>
					<falls>0</falls>
					<drops>0</drops>
				</timestep>
				<timestep>
					<time_step>36</time_step>
					<datetime>2012-3-01 19:00</datetime>
					<G>19</G>
					<HHii>19:00</HHii>
					<cloud_cover>0</cloud_cover>
					<precipitation>0.0</precipitation>
					<pressure>744</pressure>
					<temperature>-10</temperature>
					<humidity>75</humidity>
					<wind_direction>З</wind_direction>
					<wind_velocity>1</wind_velocity>
					<falls>0</falls>
					<drops>0</drops>
				</timestep>
				<timestep>
					<time_step>48</time_step>
					<datetime>2012-3-02 07:00</datetime>
					<G>7</G>
					<HHii>07:00</HHii>
					<cloud_cover>0</cloud_cover>
					<precipitation>0.0</precipitation>
					<pressure>746</pressure>
					<temperature>-18</temperature>
					<humidity>86</humidity>
					<wind_direction>В</wind_direction>
					<wind_velocity>1</wind_velocity>
					<falls>0</falls>
					<drops>0</drops>
				</timestep>
	</point>
</weather>

Код: Выделить всё

<?php

$pogoda = file_get_contents('http://rp5.ru/xml/2622/00000/ru');
preg_match('/<point_name_trim>(.*?)<\/point_name_trim>/i',$pogoda, $name);
preg_match('/<cloud_cover>(.*?)<\/cloud_cover>/i',$pogoda,$type);
preg_match('/<humidity>(.*?)<\/humidity>/i',$pogoda,$vlaga);
preg_match('/<temperature>(.*?)<\/temperature>/i',$pogoda,$temp);
preg_match('/<falls>(.*?)<\/falls>/i',$pogoda,$osadki);
preg_match('/<pressure>(.*?)<\/pressure>/i',$pogoda,$press);
preg_match('/<wind_direction>(.*?)<\/wind_direction>/i',$pogoda,$napravlenie_vetra);
preg_match('/<wind_velocity>(.*?)<\/wind_velocity>/i',$pogoda,$skorost_vetra);
preg_match('/<drops>(.*?)<\/drops>/',$pogoda, $kol_osadkov);

$vivod = "
          Облачность $type[1] %
          Осадки $osadki[1] - $kol_osadkov[1]
          Температура $temp[1] °C
          Влажность: $vlaga[1] %
          Давление:  $press[1] мм рт. ст.
          Направление ветра: $napravlenie_vetra[1]
          Скорость ветра, м/с: $skorost_vetra[1]
          ";
echo $vivod;
?>
показывает погоду за 1 день...
если я правильно понял, то надо использовать preg_match_all... а вот с ним нихрена не выходит (((
подскажите как это реализовать?
Аватара пользователя
mil
Jedi MAster
Сообщения: 1048
Зарегистрирован: 15 окт 2008, 19:54
Откуда: ыыыыы

Re: Парсер для погоды

Сообщение mil »

SimpleXML не проще заюзать? Или версия PHP не позволяет?
Не помню, кто из великих сказал... и не помню что
Изображение - как то так
Аватара пользователя
mase
ЗЛОЙ
Сообщения: 1987
Зарегистрирован: 02 фев 2011, 21:38
Контактная информация:

Re: Парсер для погоды

Сообщение mase »

mil писал(а):SimpleXML не проще заюзать? Или версия PHP не позволяет?
наверное... но чета подумалось, что xml-ки которые можно брать с сайтов погоды, очень мало информации содержат(количество дней)...
уже думаю, что лучше с html кода парсить...
Аватара пользователя
mil
Jedi MAster
Сообщения: 1048
Зарегистрирован: 15 окт 2008, 19:54
Откуда: ыыыыы

Re: Парсер для погоды

Сообщение mil »

Как знаешь. Регулярками вытягивать значения - моветон.
С html будет не проще (как я понял со страницы прогноза?)
А выводить только на 1 день такой скрипт и будет, пока foreach не используешь, например
Не помню, кто из великих сказал... и не помню что
Изображение - как то так
Аватара пользователя
mase
ЗЛОЙ
Сообщения: 1987
Зарегистрирован: 02 фев 2011, 21:38
Контактная информация:

Re: Парсер для погоды

Сообщение mase »

mil писал(а): А выводить только на 1 день такой скрипт и будет, пока foreach не используешь, например
это то да... просто с начала допереть не мог, что сначала значение массива в переменную кидаем, а потом значение переменной выводим... там все в поряде... сейчас пытаюсь c html-ок данные тянуть ...

http://www.gismeteo.ru/city/legacy/5180/" onclick="window.open(this.href);return false;
http://www.gismeteo.ru/city/legacy/5180/2/" onclick="window.open(this.href);return false;
http://www.gismeteo.ru/city/legacy/5180/4/" onclick="window.open(this.href);return false;

ЗЫ отупел я без практики... :ah:
Аватара пользователя
gil
Злой гик
Сообщения: 3193
Зарегистрирован: 31 окт 2006, 16:22

Re: Парсер для погоды

Сообщение gil »

Код: Выделить всё

<?php
$pogoda = file_get_contents('http://rp5.ru/xml/2622/00000/ru');
$pogoda = str_replace(array("\r", "\n"), "", $pogoda);
preg_match('/<point_name_trim>(.*?)<\/point_name_trim>/i', $pogoda, $name);

preg_match_all('/<timestep>(.*?)<\/timestep>/i', $pogoda, $timesteps);
foreach($timesteps[1] as $timestep)
{
	preg_match('/<datetime>(.*?)<\/datetime>/', $timestep, $date);
	preg_match('/<cloud_cover>(.*?)<\/cloud_cover>/i', $timestep, $type);
	preg_match('/<humidity>(.*?)<\/humidity>/i', $timestep, $vlaga);
	preg_match('/<temperature>(.*?)<\/temperature>/i', $timestep, $temp);
	preg_match('/<falls>(.*?)<\/falls>/i', $timestep, $osadki);
	preg_match('/<pressure>(.*?)<\/pressure>/i', $timestep, $press);
	preg_match('/<wind_direction>(.*?)<\/wind_direction>/i', $timestep, $napravlenie_vetra);
	preg_match('/<wind_velocity>(.*?)<\/wind_velocity>/i', $timestep, $skorost_vetra);
	preg_match('/<drops>(.*?)<\/drops>/',$timestep, $kol_osadkov);
	echo "Дата: {$date[1]}<br/>
         Облачность {$type[1]}%<br/>
         Осадки {$osadki[1]} - {$kol_osadkov[1]}<br/>
         Температура {$temp[1]}°C<br/>
         Влажность: {$vlaga[1]}%<br/>
         Давление:  {$press[1]} мм рт. ст.<br/>
         Направление ветра: {$napravlenie_vetra[1]}<br/>
         Скорость ветра, м/с: {$skorost_vetra[1]}<br/><br/>";
}
?>
мм?
Аватара пользователя
mase
ЗЛОЙ
Сообщения: 1987
Зарегистрирован: 02 фев 2011, 21:38
Контактная информация:

Re: Парсер для погоды

Сообщение mase »

gil писал(а):мм?
не понял вопроса? :)
Аватара пользователя
gil
Злой гик
Сообщения: 3193
Зарегистрирован: 31 окт 2006, 16:22

Re: Парсер для погоды

Сообщение gil »

ну это что-то вроде "типа так надо было?"
Аватара пользователя
mase
ЗЛОЙ
Сообщения: 1987
Зарегистрирован: 02 фев 2011, 21:38
Контактная информация:

Re: Парсер для погоды

Сообщение mase »

:ah: не заметил, что код изменён... ну да... только все равно инфы мало, на 4 дня, мне надо на неделю...
Аватара пользователя
gil
Злой гик
Сообщения: 3193
Зарегистрирован: 31 окт 2006, 16:22

Re: Парсер для погоды

Сообщение gil »

Можно ли получать полный, а не сокращённый, набор прогнозов?

Да, это возможно. По любому из населённых пунктов Вы можете получать полный набор прогнозов, обновляемый дважды в сутки. Эти данные предоставляются на платной основе по цене один доллар за один населённый пункт в месяц.

Если бесплатный набор - это 4 прогностических момента времени, то платный - 24 момента времени.
Аватара пользователя
mase
ЗЛОЙ
Сообщения: 1987
Зарегистрирован: 02 фев 2011, 21:38
Контактная информация:

Re: Парсер для погоды

Сообщение mase »

это я уже прочитал... :) а зачем платить, когда можно с html страничек выдернуть нужную инфу?
Аватара пользователя
gil
Злой гик
Сообщения: 3193
Зарегистрирован: 31 окт 2006, 16:22

Re: Парсер для погоды

Сообщение gil »

ужасающий код:

Код: Выделить всё

<?PHP
	error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);
	$page = file_get_contents('http://m.rp5.ru/2622/ru');
	
	$dom = new DOMDocument();
	$dom->loadHTML($page);
	$dom->preserveWhiteSpace = false;
	
	$content = $dom->getElementById('content');
	$name = $content->getElementsByTagName('h1')->item(0)->nodeValue;
	$output = "<h2>" . $name . "</h2>\n";
	
	$days = array();
	foreach ($content->getElementsByTagName('div') as $contentdiv)
		if ($contentdiv->getAttribute('class') == 'dayDiv')
			$days[] = $contentdiv;
	
	foreach ($days as $day)
	{
		$daydivs = $day->getElementsByTagName('div');
		$dayinfo = array();
		foreach ($daydivs as $daydiv)
		{
			if ($daydiv->getAttribute('class') == 'cDate')
				$date = $daydiv->nodeValue;
			else if ($daydiv->getAttribute('class') == 'fday')
				$dayinfo[] = $daydiv;
		}
		$output .= "<div class=\"day\">\n<h3>" . $date . ":</h3>\n";
		foreach ($dayinfo as $info)
		{
			foreach ($info->getElementsByTagName('div') as $infodiv)
			{
				switch ($infodiv->getAttribute('class'))
				{
					case 'ftime':
						$output .= "<div class=\"hour\">\n<h4>" . $infodiv->nodeValue . "</h4>\n";
						$output .= "<div class=\"content\">\n";
						break;
					case 't_0 ftemp':
						$output .= "Температура: " . $infodiv->nodeValue . "<br/>\n";
						break;
					case 't_0 ftemp_k':
						$output .= "Температура комфорта: " . $infodiv->nodeValue . "<br/>\n";
						break;
					case 'finfo':
						do
						{
							$rem = 0;
							foreach($infodiv->getElementsByTagName('span') as $finfo)
							{
								$class = $finfo->getAttribute('class');
								if (strlen($class) > 0 and substr($class, -2) != "_0")
								{
									$finfo->parentNode->removeChild($finfo);
									$rem++;
									break;
								}
							}
						} while ($rem > 0);
						$output .= trim($infodiv->textContent) . "<br/>\n";
						break;
					default: break;
				}
			}
			$output .= "</div>\n</div>\n";
		}
		$output .= "</div>\n\n";
	}
	echo $output;
?>
Аватара пользователя
mase
ЗЛОЙ
Сообщения: 1987
Зарегистрирован: 02 фев 2011, 21:38
Контактная информация:

Re: Парсер для погоды

Сообщение mase »

2 Gil :ay:

ЗЫ очень оперативно... снимаю шляпу... :sm111000:
Аватара пользователя
gil
Злой гик
Сообщения: 3193
Зарегистрирован: 31 окт 2006, 16:22

Re: Парсер для погоды

Сообщение gil »

и очень криво, лол. только в качестве примера, в какую сторону копать можно.
Ответить

Вернуться в «Программирование, администрирование и софт»