заголовки страниц

Тема в разделе "Тех. вопросы", создана пользователем absurdo, 21 фев 2008.

Статус темы:
Закрыта.
  1. absurdo

    absurdo

    Регистр.:
    22 мар 2007
    Сообщения:
    314
    Симпатии:
    8
    У меня есть список страниц моего сайта (около 8к). Как мне получить заголовок каждой страницы?
     
  2. Wiltner

    Wiltner Постоялец

    Регистр.:
    4 дек 2007
    Сообщения:
    126
    Симпатии:
    27
    В смысле, все, что заключено в <title>...</title> у каждой страницы?
    *nix-вариант:
    Код:
    [wiltner@desktop] /usr/share/doc/ru_RU.KOI8-R/books/handbook> grep '<title>' * -r | sed 's/.*://g;s/<title>\(.*\)<\/title>/\1/g' | head
    
    Использование и отладка FreeBSD ACPI
    Управление питанием и ресурсами
    Увеличение объема подкачки
    Сложные вопросы работы в сети
    Анонимный CVS
    Приложения
    Администрирование системы аудита
    Настройка системы аудита
    Ключевые понятия - краткий словарь.
     
  3. absurdo

    absurdo

    Регистр.:
    22 мар 2007
    Сообщения:
    314
    Симпатии:
    8
    ого!... Никсов нет под рукой :-( Да, нужно в итоге получить список где напротив каждого УРЛ будет его title.
     
  4. sw04

    sw04 seoplayer

    Регистр.:
    1 дек 2007
    Сообщения:
    601
    Симпатии:
    193
    PHP:
    <table>
    <?php
    $lines 
    file('1.txt');
    foreach (
    $lines as $line_num => $line) {
    $content file_get_contents($line);
    if(
    preg_match("|<title>(.*)</title>|siU",$content,$out)){
      echo 
    '<tr><td>'.$line.'</td><td>'.$out[1].'</td></tr>';
    }
    ?>
    </table>
    В файле 1.txt список сайтов. 1 строка - 1 сайт.
    Выводить в таблице. Формат вывода:
    | адрес сайте | имя сайт |
    | адрес сайте | имя сайт |
    | адрес сайте | имя сайт |
    Могут быть ошибки.
     
  5. Wiltner

    Wiltner Постоялец

    Регистр.:
    4 дек 2007
    Сообщения:
    126
    Симпатии:
    27
    absurdo
    Я думал, у тебя список файлов и тебе нужно прямо на месте определить все заголовки. В действительности при наличии только кучи url, все будет гораздо медленнее + с пожиранием трафика. Если сайт действительно твой, и если он стоит на юникс, гораздо проще применить мой вариант. Иначе, конечно, стоит воспользоваться скриптом sw04, немного его изменив.

    Ошибки действительно есть. Во-первых, отсутствует закрывающая скобка цикла, а во-вторых,
    Это из мана к функции file. Следовательно, нужно в дополнение юзать rtrim. Также в цикле определяется переменная $line_num, которая на самом деле нахрен не нужна. В итоге имеем следующий скрипт:
    PHP:
    <table>
    <?php

    $lines 
    file('1.txt');

    foreach (
    $lines as &$line) {

            
    $line rtrim($line);
            
    $content file_get_contents($line);
            
            if (
    preg_match("|<title>(.*)</title>|siU"$content$out)) {
                    echo 
    '<tr><td>'.$line.'</td><td>'.$out[1].'</td></tr>';
            }
    }
    ?>
    </table>
    Для увеличения производительности и ускорения процесса можно прикрутить треды, а то и вовсе мультиплекс, но это я делать не буду :).
     
  6. kavopero

    kavopero Читатель

    Заблокирован
    Регистр.:
    6 авг 2007
    Сообщения:
    56
    Симпатии:
    0
    Если предыдущий скрипт не будет работать, значит у вас версия пхп ниже пятой, тогда надо &$line заменить на $line
     
  7. chewie

    chewie Создатель

    Регистр.:
    17 ноя 2007
    Сообщения:
    41
    Симпатии:
    1
    Если в режиме совместимости стоит - ничего не придется дописывать.

    А вообще такую фигню написали, кто вас учил построчное считывание файла так делат? :)

    $fp = fopen('file.txt', 'r');

    while($line = fgets($fp, 1024)) {
    dosomething();
    }

    fclose($fp);
     
  8. Wiltner

    Wiltner Постоялец

    Регистр.:
    4 дек 2007
    Сообщения:
    126
    Симпатии:
    27
    Это ты фигню написал. Официальный ман пхп:
    Прежде чем вести конструктивный спор, необходимо прежде всего разобраться в предмете спора.
     
  9. chewie

    chewie Создатель

    Регистр.:
    17 ноя 2007
    Сообщения:
    41
    Симпатии:
    1
    Wiltner,

    я не хочу засорять топик, но ты понимаешь разницу между чтением файла в массив, и построчным чтением файла?

    ЗАЧЕМ В ТВОЕМ КОДЕ file_get_contents, если ты выбираешь строку из массива? file_get_contents предназначен для чтения из файла всего содержимого в виде одной строки, file - в виде массива.

    В своем коде ты из массива берешь строку, затем к этой строке применяешь file_get_contents, еще и пытаешься спорить.

    Иди читай мануалы, я уже не говорю про то, что ты передаешь по ссылке аргумент (это код для пхп4, и в этом же коде ты используешь пхп5 specific функцию).
     
  10. Wiltner

    Wiltner Постоялец

    Регистр.:
    4 дек 2007
    Сообщения:
    126
    Симпатии:
    27
    По порядку.
    PHP:
    $lines file('1.txt'); 
    В файле 1.txt находятся линки. Их мы считываем в массив для последующей обработки. Линков не миллион, не два, а всего-то 8к, чтобы делать какие-то ненужные оптимизаторские штуки. Считываю в массив, потому что мне так хочется. Никаких огромных объемов памяти для такого пустяка не надо, поэтому мне пофиг.

    Далее. Функция file_get_contents, как известно, позволяет не только получить содержимое файла целиком, но и веб-страницу.
    PHP:
    $content file_get_contents($line); 
    Все содержимое уже скачанной страницы (а в $line мы имеем веб-страницу) копируется в одну переменную, это делается для того, чтобы упростить последующее сравнивание регекспом всего одной переменной, безо всяких рид, массивов и т.д. После каждой итерации содержимое переменной перезаписывается, следовательно, ничего лишнего.

    Все верно. Беру строку из массива, т.е. линк, качаю его одной-единственной функцией в одну-единственную переменную, сравниваю регекспом шаблон с переменной. Все элементарно, все работает.

    Где написано или кто сказал, что этот код для пхп4/пхп5?

    Теперь в общем. Как сказал Ларри Уолл, there is more than one way to do it. Это применимо ко всем языкам. Я руководствуюсь этим принципом, а на остальное мне насрать. Я кодер в первую очередь на перле, и во всем у меня перловые привычки. Приведенный код прекрасно работает. Что еще надо? Если кто-то хотел показать, что он лучше может что-то сделать, я его могу только поздравить. Иди и сделай, вместо того чтобы делать нелепые указания на несуществующие ошибки. Будь частью решения, а не частью проблемы. И все у тебя в жизни будет ок :).
     
Статус темы:
Закрыта.