Консультация № 179482
13.07.2010, 14:31
0.00 руб.
0 21 1
Здравствуйте,помогите пожалуйста решить следующую задачу,никак не могу найти решения.
Нужно выдернуть часть текста из htm страницы в интернете и поместить все найденное в массив,чтобы можно было дальше с ним работать.
Ссылка на файл: meteocenter.net/msk.htm. Код нужной части текста приведу в приложении. Всем заранее спасибо за помощь.

Приложение:
<h2>Прогноз погоды в Москве</h2>

<PRE>
Москва

13.07.2010
Небольшая облачность.
Без осадков.
Ветер восточный 2-7 м/с.
Температура воздуха +28...+30°.


14.07.2010
Небольшая облачность.
Без осадков.
Ветер юго-восточный 1-6 м/с.
Температура воздуха ночью +13...+15°, днём +30...+32°.


15.07.2010
Небольшая облачность.
Без осадков.
Ветер северный 1-6 м/с.
Температура воздуха ночью +15...+17°, днём +33...+35°.


</PRE>

Обсуждение

Неизвестный
13.07.2010, 14:34
общий
Скачай класс html_simple_dom - поищи в инете - очень полезная штука, которая парсит содерживое и помещает в удобную для поиска элементов структуру.
Неизвестный
13.07.2010, 14:37
общий
Дмитрий Вакуленко:
А других методов нету? Т.к. сервер на котором я это делаю принадлежит не мне и вряд ли получится залить туда этот класс.
Неизвестный
13.07.2010, 14:43
общий
Почему не получится? Это же не модуль, который нужно на сервер устанавливать - это просто фрагмент php-кода, который ты можешь использовать в своем коде.
Неизвестный
13.07.2010, 14:45
общий
Дмитрий Вакуленко:
Спасибо за информацию. Попробую что-нибудь сделать.
Неизвестный
13.07.2010, 15:25
общий
Дмитрий Вакуленко:
Не подскажете тогда почему PHP жалуется на 3 строчку тут?
<?php
include ('/usr/webtools/GUI/VirtualServer/web-roots/62.112.106.138/domain-index/example/simple_html_dom.php');
$html = file_get_html('http://www.meteocenter.net/msk.htm');
?>
Неизвестный
13.07.2010, 15:30
общий
Без понятия. Я использую ООП-режим для этого класса в PHP5. Рекомендую и Вам использовать ООП. Кстати, какой у Вас PHP? Версия.
Неизвестный
13.07.2010, 15:35
общий
Дмитрий Вакуленко:
Версия php 4.1.2. А как именно использовать ООП в данном случае и в чем будет различие между тем что я использую и что Вы предлагаете?
Неизвестный
13.07.2010, 15:39
общий
Уууу... С четвертым php лучше про ООП и про simple_html_dom забыть. Переходите на php5 и все будет хорошо. А вообще, если требуется стянуть часть текста с HTML-страницы - воспользуйтесь регулярным выражением.
Неизвестный
13.07.2010, 15:42
общий
С регулярными ничего не вышло,по крайней мере с теми что в сети находил,а иначе бы никого не беспокоил. А вот то что на 5 версию PHP надо переходить я понимаю,просто сервак держит начальник,а он не сильно хочет переходить на 5 версию,сам не знаю почему. Если что подскажете по данному вопросу,а именно про регулярные выражения,буду очень признателен.
Неизвестный
13.07.2010, 15:42
общий
Дмитрий Вакуленко:
С регулярными ничего не вышло,по крайней мере с теми что в сети находил,а иначе бы никого не беспокоил. А вот то что на 5 версию PHP надо переходить я понимаю,просто сервак держит начальник,а он не сильно хочет переходить на 5 версию,сам не знаю почему. Если что подскажете по данному вопросу,а именно про регулярные выражения,буду очень признателен.
Неизвестный
13.07.2010, 15:47
общий
Хорошо, давайте так. У вас страница, из которой нужно текст дергать - в какой кодировке? А текст, который нужно выдернуть всегда смесь русского и английского или возможны другие языки?
Неизвестный
13.07.2010, 15:52
общий
Дмитрий Вакуленко:
Текст всегда русский,вот с кодировкой страницы проблема,не знаю какая именно. Ссылка на саму страницу в моем вопросе есть,я только код страницы смог посмотреть толком и увидеть в каком теге нужная мне информация содержится.
Неизвестный
13.07.2010, 16:15
общий
preg_match('/\<h2\>.+\<\/h2\>\s*\<PRE\>[\W\d]*\<\/pre\>/');
Неизвестный
13.07.2010, 16:19
общий
Точнее вот регулярка:

'/\<h2\>.+\<\/h2\>\s*\<PRE\>[\W\d]*\<\/PRE\>/'

либо

'/\<h2\>.+\<\/h2\>\s*\<pre\>[\W\d]*\<\/pre\>/i'

на выбор
Неизвестный
13.07.2010, 16:22
общий
А чем лучше открывать файл file_get_contents или fsockopen?
Неизвестный
13.07.2010, 16:26
общий
Я без понятия. :-)
Неизвестный
13.07.2010, 16:26
общий
Дмитрий Вакуленко:
Пробую таким образом,но на 2 строчку указывает и говорит что там ошибка,что тут не так?Я пытался что-то наподобие сделать с утра но был тот же результат?
<?php
$bash=file_get_contents('http://meteocenter.net/msk.htm');
$kol_pars1=preg_match('/\<h2\>.+\<\/h2\>\s*\<PRE\>[\W\d]*\<\/PRE\>/');
echo $kol_pars1;
?>
Неизвестный
14.07.2010, 08:22
общий
Arias:
что за ошибка?
в массив по датам?
Неизвестный
14.07.2010, 09:16
общий
Леуткин Дмитрий Николаевич:
Вот что выдает:
Fatal error: Call to undefined function: file_get_contents() in /usr/webtools/GUI/VirtualServer/web-roots/62.112.106.138/domain-index/temp.php on line 2
Неизвестный
14.07.2010, 11:08
общий
это ответ
Здравствуйте, Arias.
Проэкспериментируйте с этим кодом
в конце стоит дамп, но я думаю вы знаете что с ним делать, уберёте, когда посмотрите результат

Приложение:
$handle = fopen("http://meteocenter.net/msk.htm", "rb");
$contents = '';
while (!feof($handle)) {
$contents .= fread($handle, 8192);
}
fclose($handle);
$contents = iconv('CP1251', 'UTF8', $contents);//надо использовать если кодировка вашего сайта UTF8

$pogoda = explode('<PRE>',$contents);
$pogoda = explode('</PRE>',$pogoda[1]);
$pogoda = $pogoda[0];
preg_match_all('#\d{2}\.\d{2}\.\d{4}#', $pogoda, $date);
$pogoda = preg_split('#\d{2}\.\d{2}\.\d{4}#', $pogoda);
unset($pogoda[0]);
$date = $date[0];
if (empty($date)) return;
$result = array();
$i=0;
foreach ($pogoda as $val) {
$result[$date[$i]] = trim($val);
$i++;
}

var_dump($result); //смотрим массив
4
Спасибо за помощь,но у меня все равно выдается ошибка,что время ожидания превышено: Fatal error: Maximum execution time of 30 seconds exceeded in /usr/webtools/GUI/PHP/ErrorHandler/ErrorHandler.inc.php on line 32
Неизвестный
20.07.2010, 13:16
общий
Всем привет.
На полезном сайте http://ru.php.net/manual/en/function.file-get-contents.php утверждают, что file_get_contents() работает в PHP 4 >= 4.3.0, PHP 5. Ваша версия РНР просто не знакома с такой функцией.

Попробуйте $html = implode('', file('http://meteocenter.net/msk.htm')); - это простейшее из решений.

Зы: рекомендую присмотреться к библиотеке cURL - если она установлена на вашем сервере, то имеет смысл ей воспользоваться: она работает быстрее всех прочих вариантов.
Код:
// create curl resource 
$ch = curl_init();

// set url
curl_setopt($ch, CURLOPT_URL, "example.com");

//return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// $output contains the output string
$output = curl_exec($ch);

// close curl resource to free up system resources
curl_close($ch);
Форма ответа