[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Парссинг страниц
KAHU6AJL
Приветствую вас коллеги , буду рад помощи и доброму совету
Насколько я верно понял парсинг страницы это считывание файла с удалённого ресурса,и извлечение переменных .
хотел "парсить|" с помощью функции и 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
просто добавил посоветованные вами функции
спасибо за помощь , но то что я хотел почему то не получилось

Спустя 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)

<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 или это просто синоним ?


Спустя 2 минуты, 27 секунд (14.05.2011 - 14:29) Nikitian написал(а):
file_get_contents() вполне может быть заблокирована для работы с удалёнными серверами, плюс по быстродействию она не особо, по сравнению с curl.

Спустя 7 минут, 51 секунда (14.05.2011 - 14:37) Gradus написал(а):
KAHU6AJL, ага или не настроили или библиотеки curl вообще нет smile.gif
ereg() устаревшая функция, используйте альтернативу к примеру preg_replace()
Nikitian, вот не надо сказачнить smile.gif, если file get contents заблокирован, то curl и подавно будет, ну или этим хостом руководят хиппи laugh.gif

Спустя 5 минут, 39 секунд (14.05.2011 - 14:43) KAHU6AJL написал(а):
Nikitian , сейчас протестировал на апаче Wrong parameter count for curl_exec() пишет, я об этой функции ничего не знаю, возможно ещё не дошёл до неё, буду рад почитать про неё ,
всё ушёл обедать biggrin.gif , скоро приду

Спустя 8 минут, 27 секунд (14.05.2011 - 14:51) Nikitian написал(а):
Gradus
У пользователя 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]

<?
$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 написал(а):
вопрос такой при обработке файла


<?
$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>
<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>
нужно записать все цифры такого рода 00,00([0-9][0-9]\,[0-9][0-9]регулярка) в переменные , у меня получается только 1 записать 27.40, может как то число итерации можно ввести или цикл встроить ?

Спустя 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!

Спустя 3 часа, 11 минут, 18 секунд (5.06.2011 - 21:46) walerus написал(а):
Если прочесть внимательнее мой пост, то можно найти вот такую строку
// 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 массив содержит все массивы,
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.