Насколько я верно понял парсинг страницы это считывание файла с удалённого ресурса,и извлечение переменных .
хотел "парсить|" с помощью функции и file() ereg()
суть заключается в том , что файл какой бы он небыл нужно прочитать изначально, а потом записать
в другой файл или как то можно сразу обработать файл?
<html>
<head>
<title></title>
</head>
<body>
<form action="savingfile.php" method="POST" ><textarea rows=5 cols=20 name="testsave">Напишите ваше имя </textarea>
<input type="submit" value="записать" name="testsave">
<?php
if(isset($_POST['testsave'])) {
$fp1 = fopen("http://forum.kelia.ru/forum.php", "r");
$fp2 = fread($fp1, 1024);
$fp = fopen("testfile.txt", "a+");
fputs($fp,$fp1);
$stat = stat("testfile.txt");
echo "размер равен $stat[7]";
fclose($fp);
include("testfile.txt"); }
?>
</body>
</html>
этот код я попробовал для примера , но почему-то запись в файл происходит слудующая Resource id #2Resource id #2 может php формирует нде то ещё dat file или что то в этом роде ?
где его можно найти ? или как мне считать данные с файла и записать их в обычный документ ?
Спустя 34 минуты, 57 секунд (13.05.2011 - 21:30) Gradus написал(а):
$file=file_get_contents('url');
file_put_contents("testfile.txt", $file);
echo $file;
Спустя 13 минут, 7 секунд (13.05.2011 - 21:43) Nikitian написал(а):
$ch = curl_init($uri);
$data = curl_exec($ch);
curl_close($ch);
//В $data загруженные данные
Спустя 2 часа, 26 минут, 44 секунды (14.05.2011 - 00:10) KAHU6AJL написал(а):
попробовал сделать это , может я что то не то делаю
при загрузке на сервер (помоему апач ) выходит такая ошибка Parse error: syntax error, unexpected T_VARIABLE
а на сервере iis
500 Internal Server Error
Status: 500 Internal Server Error
X-Powered-By: PHP/5.3.6
Content-type: text/html
просто добавил посоветованные вами функции
спасибо за помощь , но то что я хотел почему то не получилось
при загрузке на сервер (помоему апач ) выходит такая ошибка Parse error: syntax error, unexpected T_VARIABLE
а на сервере iis
500 Internal Server Error
Status: 500 Internal Server Error
X-Powered-By: PHP/5.3.6
Content-type: text/html
просто добавил посоветованные вами функции
спасибо за помощь , но то что я хотел почему то не получилось
Спустя 30 минут, 26 секунд (14.05.2011 - 00:40) Nikitian написал(а):
Покажите полностью код, который вызывает ошибку
Спустя 13 часов, 28 минут, 35 секунд (14.05.2011 - 14:09) KAHU6AJL написал(а):
спасибо , я попробовал оба варианта, сразу , и вот оно получилось , скорее всего ошибка была моя в том , что я не задавал переменную url . Сначало пробовал только Nikitian способ , но в файл лишь записвывалось значение 1(эта функция будет полезна ,кода нужно будет удостоверится считалось ли содержимое) , а в IIS вообще говорила что такой функции не знает PHP Fatal error: Call to undefined function curl_init() (но скорее это , я просто ещё не настроил php.ini)
далее в парсинге нужно мне отыскать цифры , какую функцию лучше использовать , склоняюсь к ereg() ещё ни разу не пробовал , всё когда то бывает впервые.
<html>
<head>
<title></title>
</head>
<body>
<form action="savingfile.php" method="POST" >
<input type="submit" value="записать" name="testsave">
</form>
<?php
if(isset($_POST['testsave'])) {
$fp = fopen("testfile.txt", "a+");
$fp3 = "http://forum.kelia.ru/forum.php" ;
$ch = curl_init($fp3);
$data = curl_exec($ch);
fwrite($fp,$ch);
curl_close($ch);
/* но после этого я добавил в код $file=file_get_contents($fp3);
file_put_contents("testfile.txt", $file);
echo $file; и о чудо свершилось , файл записался */
$stat = stat("testfile.txt");
echo "размер равен $stat[7]";
fclose($fp);
}
?>
</body>
</html>
далее в парсинге нужно мне отыскать цифры , какую функцию лучше использовать , склоняюсь к ereg() ещё ни разу не пробовал , всё когда то бывает впервые.
Спустя 7 минут, 36 секунд (14.05.2011 - 14:17) Nikitian написал(а):
В моём методе ошибка. Забыл, что если не указывать returntransfer, то curl_exec возвращает true/false
Так будет более полно:
Так будет более полно:
$ch = curl_init($uri);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);
//В $data загруженные данные
Спустя 10 минут, 4 секунды (14.05.2011 - 14:27) KAHU6AJL написал(а):
ещё раз спасибо , обязательно протестирую после обеда, данную функцию ,
а чем отличается данная функия от той , что предложил Gradus или это просто синоним ?
а чем отличается данная функия от той , что предложил Gradus или это просто синоним ?
Спустя 2 минуты, 27 секунд (14.05.2011 - 14:29) Nikitian написал(а):
file_get_contents() вполне может быть заблокирована для работы с удалёнными серверами, плюс по быстродействию она не особо, по сравнению с curl.
Спустя 7 минут, 51 секунда (14.05.2011 - 14:37) Gradus написал(а):
KAHU6AJL, ага или не настроили или библиотеки curl вообще нет ![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
ereg() устаревшая функция, используйте альтернативу к примеру preg_replace()
Nikitian, вот не надо сказачнить
, если file get contents заблокирован, то curl и подавно будет, ну или этим хостом руководят хиппи
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
ereg() устаревшая функция, используйте альтернативу к примеру preg_replace()
Nikitian, вот не надо сказачнить
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
![laugh.gif](http://phpforum.ru/html/emoticons/laugh.gif)
Спустя 5 минут, 39 секунд (14.05.2011 - 14:43) KAHU6AJL написал(а):
Nikitian , сейчас протестировал на апаче Wrong parameter count for curl_exec() пишет, я об этой функции ничего не знаю, возможно ещё не дошёл до неё, буду рад почитать про неё ,
всё ушёл обедать
, скоро приду
всё ушёл обедать
![biggrin.gif](http://phpforum.ru/html/emoticons/biggrin.gif)
Спустя 8 минут, 27 секунд (14.05.2011 - 14:51) Nikitian написал(а):
Gradus
У пользователя curl установлен. Курлу никогда не запрещают внешние соединения, ибо нет такой настройки в php.ini и никто не будет пилить исходники php для этого, курл для внешних соединений и предусмотрен. Так что если curl_init() на апаче не вызвал ошибку, значит он будет работать.
allow_url_fopen off у заказчика встречал буквально на днях. Правда это сервер заказчика и зачем и кто ему так настроил не знаю, но факт остаётся - было.
KAHU6AJL
А сколько параметров передаёте функции? Ошибка говорит о том, что не столько, сколько она умеет принимать. Надо только $ch - ресурс curl
У пользователя curl установлен. Курлу никогда не запрещают внешние соединения, ибо нет такой настройки в php.ini и никто не будет пилить исходники php для этого, курл для внешних соединений и предусмотрен. Так что если curl_init() на апаче не вызвал ошибку, значит он будет работать.
allow_url_fopen off у заказчика встречал буквально на днях. Правда это сервер заказчика и зачем и кто ему так настроил не знаю, но факт остаётся - было.
KAHU6AJL
А сколько параметров передаёте функции? Ошибка говорит о том, что не столько, сколько она умеет принимать. Надо только $ch - ресурс curl
Спустя 13 минут, 8 секунд (14.05.2011 - 15:04) Gradus написал(а):
Nikitian, на апаче установлен, а там где Call to undefined function curl_init неизветсно.Что мешает allow_url_fopen on ? сами лезли ковырять сами и виноваты с таким же успехом могли бы закоментить модули, тот же curl.А если нет возвожности работать с curl , то тоже в исходники лезть надо.Без сомненно curl лучше, но надо усматривать кто, как и для каких целей с ним будет работать.В данном случае я думаю автору легче использвать file_get_contents()
Спустя 40 минут, 19 секунд (14.05.2011 - 15:44) KAHU6AJL написал(а):
Цитата (Nikitian @ 14.05.2011 - 11:51) |
KAHU6AJL А сколько параметров передаёте функции? Ошибка говорит о том, что не столько, сколько она умеет принимать. Надо только $ch - ресурс curl |
я хотел попробовать return , тоесть возвратитть данные, как там написать просто return $ch ? вообщем что в моём случае писать нужно?
$ch = curl_init($uri);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // в этой строке или просто return поставить ?
$data = curl_exec($ch);
curl_close($ch);
Спустя 8 минут, 8 секунд (14.05.2011 - 15:53) Nikitian написал(а):
$ch = curl_init($uri);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // в этой строке или просто return поставить ?
$data = curl_exec($ch);
curl_close($ch);
return$data;
Спустя 2 часа, 26 минут, 26 секунд (14.05.2011 - 18:19) KAHU6AJL написал(а):
сейчас подумал , о том что для парсинга лучше пусть данные в переменную запишуться, так легче обработать будет , думаю код займёт меньше места с этим вариантом.
Спустя 18 дней, 20 часов, 59 минут, 1 секунда (3.06.2011 - 15:18) KAHU6AJL написал(а):
Очень помогло, научился сохранять сайты в файл , но
не получается вытащить из этого файла все числа с дробной частью
получается только один с помощью еreg() ,а надо что бы весь файл был проанализирован, и резултьаты записались в массивы, а не один результат в массив $reg[0]
тоесть я в файле нашёл более одного такого регулярного выражения ,а ereg() записывает только самое первое найденое , как всё то записать в массивы ,?
не получается вытащить из этого файла все числа с дробной частью
получается только один с помощью еreg() ,а надо что бы весь файл был проанализирован, и резултьаты записались в массивы, а не один результат в массив $reg[0]
<?
$file=file_get_contents("http://testsite.com");
$file2=file_put_contents("testfile.txt", $file);
$parsing= ereg("[0-9][0-9]\,[0-9][0-9]",$file,$reg);
print_r($reg);
?>
тоесть я в файле нашёл более одного такого регулярного выражения ,а ereg() записывает только самое первое найденое , как всё то записать в массивы ,?
Спустя 4 часа, 23 минуты, 57 секунд (3.06.2011 - 19:42) KAHU6AJL написал(а):
вопрос такой при обработке файла
Как селать что бы ereg не останавливался на первом найденом выражении?
<?
$file=file_get_contents("http://testsite.com");
ereg("[0-9][0-9]\,[0-9][0-9]",$file,$reg); // ищу числа такого вида
print_r($reg); /*выводится только $reg[0] => 00.99, а в файле ещё есть подобные числа,
как сделать так то чтобы ereg() отображал все чичла в виде массивов ($reg[1]=>00.33
$reg[2]=>33.33 $reg[3]=>33.22)*/
?>
Как селать что бы ereg не останавливался на первом найденом выражении?
Спустя 2 часа, 49 минут, 6 секунд (3.06.2011 - 22:31) walerus написал(а):
а чего не использовать preg_match ?
Дай сцилко и что распарсить нужно, а то я по ветке чет не совсем понял что нужно найти
Дай сцилко и что распарсить нужно, а то я по ветке чет не совсем понял что нужно найти
Спустя 4 часа, 21 минута, 50 секунд (4.06.2011 - 02:53) KAHU6AJL написал(а):
<html>нужно записать все цифры такого рода 00,00([0-9][0-9]\,[0-9][0-9]регулярка) в переменные , у меня получается только 1 записать 27.40, может как то число итерации можно ввести или цикл встроить ?
<head>
<title></title>
</head>
<body>
<form action="savingfile.php" method="POST" >
<input type="submit" value="записать" name="testsave">
</form>
<?php
if(isset($_POST['testsave'])) {
$file=file_get_contents("http://www.ubrr.ru/core.php?p=75");
$file2=file_put_contents("testfile.txt", $file);
ereg('[0-9][0-9]\,[0-9][0-9]',$file,$regs[]);
print_r($regs);
$stat = stat("testfile.txt");
echo "размер равен $stat[7]";
}
?>
</body>
</html>
Спустя 14 часов, 4 минуты, 32 секунды (4.06.2011 - 16:57) walerus написал(а):
Вот готовый скрипт, под себя надеюсь переделаешь и поймешь в чем была проблема )).
Результат работы:
Будет непонятно - пиши )
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Parse</title>
</head>
<body>
<?
set_time_limit(0);
error_reporting(E_ALL);
// Получили страницу
$data = file_get_contents('http://www.ubrr.ru/core.php?p=75');
// Переконвертировали в UTF-8
$data = iconv('windows-1251', 'utf-8', $data);
// Нашли нашу таблицу
preg_match('~<!-- // 3 таблица -->(.*)<!-- // 3 таблица закрылась -->~iUs', $data, $match);
// Проверили есть ли данные
if ( isset($match[1]) && trim($match[1]) != '')
$table = $match[1];
else
die('Not Data match');
// Ищем курсы валют
preg_match_all('~<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=3 WIDTH=40>(.*)</table>~iUs', $table, $table_match);
// Проверили есть ли данные
if ( isset($table_match[1]) && trim($table_match[1][0]) != '')
$table_match = $table_match[1];
else
die('Not Data table_match ');
$result = array();
$result_name= array();
foreach ($table_match as $line)
{
preg_match('~<b>(.*)</b>~', $line, $match_name);
if ( isset($match_name[1]) && trim($match_name[1]) != '')
$result_name[] = trim($match_name[1]);
}
// preg_match_all('~\d{2},\d{2}~iUs', $table, $match_value); // Регулярка ищет только числа вида " 22,33 ", т.е. два числа до запятой, два после
// Выдераем все значения
preg_match_all('~<TD\s\s?WIDTH=110 class=(curr_val_pink|curr_val_grn) align=center>(.*)</td>~iUs', $table, $match_value);
if ( isset( $match_value[2] ) && trim( $match_value[2][0] != '' ) )
{
$tmp_array = array();
$tmp_count = 0;
foreach($match_value[2] as $value)
{
if (count($tmp_array) == 2)
{
$result[$result_name[$tmp_count]] = array( 'purchase' => $tmp_array[0], 'sale' => $tmp_array[1] );
$tmp_count++;
$tmp_array = array();
$tmp_array[] = trim($value);
}
else
$tmp_array[] = trim($value);
}
}
// Результат
echo "<pre>";
print_r($result);
echo "</pre>";
?>
</body>
</html>
Результат работы:
Array
(
[USD] => Array
(
[purchase] => 27,40
[sale] => 28,40
)
[EUR] => Array
(
[purchase] => 39,60
[sale] => 41,20
)
[GBP] => Array
(
[purchase] => 44,20
[sale] => 46,60
)
[DKK 10] => Array
(
[purchase] => отсут.
[sale] => отсут.
)
[JPY 100] => Array
(
[purchase] => отсут.
[sale] => отсут.
)
[Au] => Array
(
[purchase] => отсут.
[sale] => отсут.
)
)
Будет непонятно - пиши )
Спустя 1 день, 1 час, 37 минут, 41 секунда (5.06.2011 - 18:35) KAHU6AJL написал(а):
очень сложная схема, можноли какнибудь сделать при помощи ereg() ? Если возможно, то как ?
Просто мне ещё xml учить, а вопрос времени всегда актуальный , поэому хочется выучть в минимальные сроки, сегодня попробую разобрать это под пивко =) , но думаю уйдёт неделя, в лучшем случае дня 3 .
------------------------------------------
Приятно, когда есть люди которые тебя понимают . Cyber Punk Forever!
Просто мне ещё xml учить, а вопрос времени всегда актуальный , поэому хочется выучть в минимальные сроки, сегодня попробую разобрать это под пивко =) , но думаю уйдёт неделя, в лучшем случае дня 3 .
------------------------------------------
Приятно, когда есть люди которые тебя понимают . Cyber Punk Forever!
Спустя 3 часа, 11 минут, 18 секунд (5.06.2011 - 21:46) walerus написал(а):
Если прочесть внимательнее мой пост, то можно найти вот такую строку
По поводу ereg() - цитирую...
// preg_match_all('~\d{2},\d{2}~iUs', $table, $match_value); // Регулярка ищет только числа вида " 22,33 ", т.е. два числа до запятой, два после
- это и есть тот минимум который был нужен, я расписал все подробно, что бы можно было понять, что и как я искал, потому что, бывают разные "исходные коды", и просто так найти именно значения "22,33" - без поиска по блокам, становится невозможно.По поводу ereg() - цитирую...
Цитата |
Описание int ereg ( string pattern, string string [, array regs]) Примечание: preg_match(), которая использует Perl-совместимый синтаксис регулярного выражения, работает часто быстрее, чем ereg(). |
, т.е. preg_match будет работать быстрее...
Поправляя твой код -
Поправляя твой код -
<?
$file=file_get_contents("http://testsite.com");
$file2=file_put_contents("testfile.txt", $file);
preg_match_all('~\d{2},\d{2}~iUs', $file, $match_value);
print_r($match_value);
?>
Спустя 1 день, 3 часа, 13 минут, 30 секунд (7.06.2011 - 01:00) KAHU6AJL написал(а):
вообщем , оказывается 0 массив содержит все массивы,