Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: чтение из фала и file_get_html

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
mrstorm
Отправлено: 04 Декабря, 2014 - 12:47:29
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Дек. 2014  


Помог: 0 раз(а)




Добрый день, уважаемые Гуру программирования на php.
Я новичок в этом деле, но стараюсь освоить данный язык программирования.
Два дня пытаюсь сделать простенький парсер некоторого контента с некоторого сайта. Суть парсера - есть файл с адресами страниц сайта, в обычном текстовом файле. Каждая страница - с новой строки. Парсер должен взять каждую страницу, найти в html коде страницы тег ( в моем случае это тег H1) и сохранить то что между этим тегом в другой текстовый файл.

В настойщий момент написал код такого вида:
PHP:
скопировать код в буфер обмена
  1. <?
  2. include 'simple_html_dom.php';
  3. $k[1] = 'http://mail.ru';
  4. $k[2] = 'http://iphones.ru';
  5. $k[3] = 'http://mail.com';
  6.  
  7.  
  8. for ($i=1; $i<=3; $i++) {
  9.     echo $i;
  10.     echo $k[$i];
  11.    echo file_get_html($k[$i])->find('h1',0);
  12. }
  13. ?>

и на выходе я получаю список заголовков (под тегом H1) с каждого сайта. Принцип понятен, теперь пытаюсь чтобы скрипт брал данные из текстового файла, для этого дописываю код чтения данных из файла в массив:

PHP:
скопировать код в буфер обмена
  1. $url = fopen("url.txt", "r"); //открываем файл
  2.  
  3. for ($y=1; $y<=2; $y++) { //запускаем цикл ( далее сделаю через while)
  4.     $k[$y] = fgets($url);  //производим запись в массив $k
  5.        
  6. }
  7.     fclose($url); //закрываю текстовый файл

данный код совершенно спокойно выводит данные, которые записаны в тектовом файле и в последствии считанные в массив $k.

Далее - объединяю два кода и получаю :

PHP:
скопировать код в буфер обмена
  1. include 'simple_html_dom.php';
  2.  
  3. $url = fopen("url.txt", "r"); //
  4.  
  5. for ($y=1; $y<=2; $y++) {
  6.     $k[$y] = fgets($url);
  7.        
  8. }
  9.     fclose($url);
  10.    
  11. for ($i=1; $i<=2; $i++) {
  12.     echo $i; //выводу номер по порядку
  13.     echo $k[$i];  //вывожу ссылку из текстового файла
  14.    echo file_get_html($k[$i])->find('h1',0); //вывожу данные тега H1 по ссылке
  15. }


после этого на выходе я получаю только вывод на экран самой первой строчки из текстового файла. На этом я понимаю, что скрипт дальше не обрабатывает данные. Но если в текстовом файле оставить только одну строчку, то скрипт начинает правильно обрабатывать данные, выводит нужный текст между тегом H1. Понимаю, что скорее всего дело в лишних переносах, т.к. именно после добавление новой строки в текстовый файл появляется ошибка.

Буду благодарен за ответ. Заранее прошу прощение за допущенные ошибки в коде.
 
 Top
Panoptik
Отправлено: 04 Декабря, 2014 - 13:00:41
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




замените вот это

PHP:
скопировать код в буфер обмена
  1. $url = fopen("url.txt", "r"); //
  2.  
  3. for ($y=1; $y<=2; $y++) {
  4.     $k[$y] = fgets($url);
  5.        
  6. }
  7.     fclose($url);
  8.    
  9. for ($i=1; $i<=2; $i++) {
  10. echo $i; //выводу номер по порядку
  11.     echo $k[$i];  //вывожу ссылку из текстового файла
  12.    echo file_get_html($k[$i])->find('h1',0); //вывожу данные тега H1 по ссылке
  13. }


на єто


PHP:
скопировать код в буфер обмена
  1. $urls = file('url.txt');
  2. foreach($urls as $i => $url) {
  3.     // пропускаем пустые строки в файле
  4.     if(!$url) continue;
  5.    
  6.     echo $i; //выводу номер по порядку
  7.     echo $url;  //вывожу ссылку из текстового файла
  8.     echo file_get_html($url)->find('h1',0); //вывожу данные тега H1 по ссылке
  9. }
  10.  


так будет короче

насколько я вижу, в цикле вы принудительно ограничивали количество итераций до 1 поэтому следующая итерация так и не начиналась
почитайте про циклы for, while, foreach

можно конечно решить вопрос с помощью for только в условии выхода из цикла нужно указать граничное значение вместо 2

примерно так

PHP:
скопировать код в буфер обмена
  1.  
  2. $k = array();
  3. while (($buffer = fgets($handle, 4096)) !== false) {
  4.    // пропускаем пустые строки
  5.    if(!$buffer) continue;
  6.         $k[] = $buffer;
  7.     }
  8.     fclose($url);
  9.    
  10. // считаем количество элементов в массиве
  11. $cnt = count($k);
  12. for ($i=1; $i<=$cnt; $i++) {


-----
Just do it
 
 Top
mrstorm
Отправлено: 04 Декабря, 2014 - 13:55:21
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Дек. 2014  


Помог: 0 раз(а)




Изменил код:
PHP:
скопировать код в буфер обмена
  1. include 'simple_html_dom.php';
  2.  
  3. $urls = file('url.txt');
  4. foreach($urls as $i => $url) {
  5.     // пропускаем пустые строки в файле
  6.     if(!$url) continue;
  7.    
  8.     echo $i; //выводу номер по порядку
  9.     echo $url;  //вывожу ссылку из текстового файла
  10.     echo file_get_html($url)->find('h1',0); //вывожу данные тега H1 по ссылке
  11. }


но все равно результат такой же - если более одной строчки в файле - выводит только ссылку и номер по порядку. А поиск по тегу - не делает. Тут именно проблема в совмещении импорта ссылок из файла и получения нужных данных по этим ссылкам.
(Добавление)
Вообщем сам нашел решение - нужно было при записи в массив удалить все возможные пробелы и переносы. Скорее всего перенос записывался в массив к значению, и уже открыть сайт скрипту не удавалось. Решил вопрос вот так:

PHP:
скопировать код в буфер обмена
  1. $k[$y] = str_replace("\n", ' ', fgets($url));  //производим запись в массив $k


А определить как долго будет идти цикл решил с помощью:



В итоге код имеет слудующий вид:

PHP:
скопировать код в буфер обмена
  1. include 'simple_html_dom.php';
  2.  
  3. $url = fopen("url.txt", "r"); //открываем файл
  4.  
  5. $lineCount = count(file('url.txt'));
  6.  
  7. for ($y=1; $y<=$lineCount; $y++) { //запускаем цикл ( далее сделаю через while)
  8.     $k[$y] = str_replace("\n", ' ', fgets($url));  //производим запись в массив $k
  9. }
  10.     fclose($url); //закрываю текстовый файл
  11.    
  12. for ($i=1; $i<=$lineCount; $i++){
  13.    // echo $i; //выводу номер по порядку
  14.    // echo $k[$i];  //вывожу ссылку из текстового файла
  15.     echo file_get_html($k[$i])->find('h1',0); //вывожу данные тега H1 по ссылке
  16. }

это рабочий скрипт, позволяет вывести на экран значение тега H1 с сайта. В дальнейшем хочу чтобы это значение писалось в соседний текстовый файл, может через разделитель. Как доделаю выложу, может кому то понадобиться Улыбка
 
 Top
Bio man
Отправлено: 04 Декабря, 2014 - 18:42:44
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




По моему лучше заменить это
PHP:
скопировать код в буфер обмена
  1. for ($y=1; $y<=$lineCount; $y++) { //запускаем цикл ( далее сделаю через while)
  2.     $k[$y] = str_replace("\n", ' ', fgets($url));  //производим запись в массив $k
  3. }

на это
PHP:
скопировать код в буфер обмена
  1. while ($line = fgets($url)) {
  2.     $k[$y] = str_replace("\n", ' ', $line);
  3. }


и это
PHP:
скопировать код в буфер обмена
  1. for ($i=1; $i<=$lineCount; $i++){
  2.    // echo $i; //выводу номер по порядку
  3.    // echo $k[$i];  //вывожу ссылку из текстового файла
  4.     echo file_get_html($k[$i])->find('h1',0);
  5. }

на это
PHP:
скопировать код в буфер обмена
  1. foreach ($k as $value){
  2.     echo file_get_html($value)->find('h1',0); //вывожу данные тега H1 по ссылке
  3. }
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB