Forum Webscript.Ru
Программирование => PHP => Тема начата: kosm от 07 Мая 2003, 19:17:27
-
Народ, подскажите плиз, как забрать страничку по урлу, что-то из нее выкусить и получить свой вариант?
СПАСИБО!
-
Вор должен сидеть в тюрьме.
-
а если ты хочешь забирать новости или что-то такое, то вот:
http://spectator.ru/issues/352
-
Сори, если ввел в заблуждение, не написав причину :)
Никто ничего воровать не собирается, просто хочу для себя сделать "каналы" в удобоваримом виде для КПК (без всяких банеров, фреймов и т.п. - только информация). Если это криминал - тогда сорри, больше спрашивать не буду... :)
-
http://www.php.net/file
-
semya
Спасибо! Начал разбираться...
А как по твоиму, лучше массивом по строчка лазить или все таки в одну переменную контент заливать а его уже разбирать?
Кстати, чем лучше выкусить потом то что надо?
-
да все очень просто, находишь два куска кода, который ограничивает искомый текст, и выкусываешь его так:
preg_match("(ограничитель1)(.*)(ограничитель2)",implode(\'\',file(\'http://www.pupkin.ru\')),$matches);
в $matches[2] будет искомый кусок, только надо аккуратней с (.*) он может захватить больше чем положено, об этом читай в книжках по регэкспам и их максимализме, а если надо будет конкретная помощь по данному случаю, то спрашивай...
-
semya
Ок. Спасибо, попробую.
-
semya
А как через проксю или socks5 пройти? Ни fopen, ни fsockopen вроде не проходят :( Во всяком случае ошибка по таймауту...
-
Все, спасибо, разобрался. Цепляюсь за проксю через fsockproxy, и формирую запрос на нужный урл.
Теперь вопрос вот в чем. В ответ я получаю текст странички вместе с заголовком. Как лучше избавиться от него (заголовка)?
Пробовал так:
$z = preg_replace("/^.*/","",$k);
$k - массив-ответ на запрос
Что я не так в рег.выражении написал?
СПАСИБО!
-
"/^.*/s" или "/^.*/m" (точно не помню, вроде первое)
-
Фу, зачем здесь регекспы?!
list($headers, $content) = explode("\\r\\n\\r\\n", $k)
Только обязательно забирай HTTP/1.0, а не 1.1!
-
FreeSpace
А по тексту странички нигде больше "\\r\\n\\r\\n" встретиться не может?
Макс
Т.е. все как у меня, только еще s или m? А что из них по умолчанию подразумевается вроде?
Вообще конечно регекспами мне все равно надо будет коцать страничку, т.к. хочу всякие банеры повырезать, фреймы и тд.
-
Да, ступил малость...
Просто на моей практике ни разу не попадалось.
Вот так будет правильнее:
$tmp = explode("\\r\\n\\r\\n", $k);
array_shift($tmp);
$content = implode("\\r\\n\\r\\n", $tmp);
-
FreeSpace
Угумс, так действительно проблем не будет.
Спасибо!
Хм, а все-таки, почему мой регексп не прокатил? Просто мне теперь надо коцать сам текст странички, а там как я понимаю, без них не обойтись...
-
kosm
:
Хм, а все-таки, почему мой регексп не прокатил?
$z = preg_replace("/^(.*)/","",$k);
В данном случае, необходимые данные будут в переменной $z а обрабатываются данные из $k
-
Странно, но у меня все равно с заголовок остается :( (как будто ничего и не происходило).
-
Ребят, ничего не понимаю, почему же у меня не хочет регексп работать, а?
Гляньте плиз (начало ответа на запрос):
HTTP/1.0 200 OK
Date: Thu, 15 May 2003 05:58:31 GMT
Server: Apache/1.3.12 (Unix) mod_ssl/2.6.2 OpenSSL/0.9.4 PHP/4.3.1
Cache-Control: max-age=3600
Expires: Thu, 15 May 2003 06:58:31 GMT
Content-Type: text/html
Age: 3324
X-Cache: HIT from maslan.maspeter.ru
Proxy-Connection: close
Пробую вырезать заголовок (хоть и подсказали как сделать через implode, но регеспы мне все равно надо, так хоть потренируюсь)...
$z = preg_replace("/^(.*)/"," ",$k);
В $k ответ на запрос вместе с заголовком. В $z хочу получить без заголовка. Что не так с регекспом?
Спасибо!
PS: Как вообще эта ф-ция обрабатывает этот массив $k? Построчно? Тогда как писать регесп? Или как единый текст (тогда не понятно почему не работает)? Может какие-то модификаторы надо ставить?
-
то что я говорил по поводу максимализма коснтрукции (.*) !!!! я же говорил, чтобы почитал по этому поводу! вопрос: как ты думаешь левая угловая скобка < попадает в эту конструкцию? так когда же ей осановиться? вот она все под себя и забирает, доходит до конца строки и не находит там , т.к. все уже забрала! Эта конструкция работает по максимальному принципу, понимаешь? поэтому если теоретически тегов в заголовках не будет, то использовать тебе нужно не (.*) а ([^<]+) - тогда должно получится, но вообще если тебе надо текст страницы отделить, то можно и проще и быстрее сделать это через explode("",$k)...
-
semya
Sorry, но я чего-то недогоняю :( Я же в конструкции явно указываю полный тег . Почему он должен рассатривать отдельно угловую скобку? А если использовать ([^<]+), и вдруг окажется не в начале строки?
Заголовок отделить через explode - понятно (кстати, спасибо за подсказку на счет разделения по тегу , сразу недопер :)
Но мне ведь еще всю страницу надо покоцать... Т.е. грубо говоря от того что я сейчас получил, в итоге должно остаться 10-15%. И если я уж в таком простом случае не могу уже что-то откоцать, то похоже я дальше вообще усядусь в лужу ;) Слушай, а есть где-нить нармальная статейка по поводу жадности этой конструкции (.*)? Хоть может разберусь, да вопросы дальше ами отпадут...
Еще раз спасибо за помощь!
-
$body = substr($k, -(strlen($k) - strpos($k, "\\r\\n\\r\\n", $k)));
зачем всякие извраты?
-
trent
Ну вот, еще один способ вырезать заголовок :) Спасибо.
Т.е. ты предлагаешь коцать страницу не средствами регекспов?
Думаешь это удобно будет?
-
>Думаешь это удобно будет?
это будет быстрее
-
trent
это будет быстрее
однозначно, никто не спорит!
но не так универсально и функционально!
kosm
про жадность максимальных операторов я вычитал в отличной книге по регэкспам издательства питер... (вот тут http://www.piter.com/book_about.phtml?id=978531800056&web_ok=no ) в инете я такого хорошего материала по регэкспам не встречал, но это уже не по этой теме форума....
насчет того, что тебе потом надо коцать все: ты всегда тащишь одну и ту же страницу или ты хочешь таскать разные порезки? в любом случае я бы выдирал отдельно все что между тайтлами, и между боди... а там уже работал более целенаправленно
-
Да, страничка всегда одна и таже, но инфа меняется. При чем, в ней только заголовки новостей, а надо будет еще ходить по ссылке, брать новость (каждую) и вставлять в главную ниже заголовка (или отдельной страницей, тоже оптимизированой/покоцаной). Примерно так. Как думаешь, сложная задача?
Кстати, попробовал трой регексп
$z = preg_replace("/([^<]+)/i","",$k);
Прокатил, но смысл его не понял :(
Можешь вкрадце объяснить, в чем прикол?
-
kosm
Можешь вкрадце объяснить, в чем прикол?
объясню, опираясь на данные из той книги что я советую сейчас всем... дело в том, что точка в регэкспах - это любой символ, ЛЮБОЙ, а значит и < тэги тоже! и поэтому у тебя весь текст полученный через сокет ( или как там ) все попадает туда, и общего совпадения не получается, а следовательно и менять нечего preg_replace()ом... чтобы этого не происходило (это ведь на самом деле правильно, так и работают регэкспы) пишем, что нам нужно любое количество символов, которые не являются открывающим тэгом (за это отвечает плюс и контрукция выбора [^<] = не левый тэг), регэксп ищет любой символ который не является левым тэгом, находит, видит плюс, знает что надо искать еще, еще находит, а птом находит этот тэг, что ему остается? перейти к следующей контрукции... а это он его находит... получается обшее совпадение, вот он его и меняет...
сложная задача?
абсолютно нет, но придется следить за тем, чтобы синтаксис на странице не поменялся...
-
Не в тему конечно, но все же. Разве не бывает для KПК специальных бовзеров? Че нить типа Lynx например?
-
rembo
Под WinCE есть (почти) полноценный IE :)
Или тебе нужен именно текстовый?
-
rembo
согласен абсолютно не в тему!!!
-
rembo
Раз вопрос не в тему был вроде как ко мне, то все-таки отвечу (разок) :)
Браузер есть конечно, но есть такое понятие как канал (оффлайн новости, оптимизированные для КПКашного браузера IE или iSilo). Просто загонять сайт в КПК и смотреть через IE или iSilo не интересно потому, что как понимаешь у КПК экран не такой большой и всякие банеры, фреймы и тп просто не дают нормально просматривать контент. Поэтому я хочу парочку сайтов с новостями под себя заточить...
semya
Спасибо за пояснения.Конечно с трудом до меня доходит почему не работает конструкция .* :) Т.е. получается при таком выражении парсер просто берет весь текст (сразу), не пробегая по нему? Получается так? Потому как ты пишешь конструкция [^<]+ заставляет бежать по тексту в поисках < с начала текста, а потом уже берет следующее вхождение . Я прально тебя понял?
Сорри, если туплю, просто разобраться хочу, чтобы дальше двигаться.
PS: Книжку твою уже заказал, на следующей неделе должны подвезти...
PPS: Кстати, случаем не встречал какой-нить утилитки для отладки регекспов?
СПАСИБО!
-
Кстати, случаем не встречал какой-нить утилитки для отладки регекспов?
неа, а было бы интересно! найдешь кидай ссылку, или мож кто подскажет. Я думаю, что насчет жадности максимальных операторов регэкспов тебе книжка подскажет намного больше. Кстати после ее прочтения, начал намного активнее юзать регэкспы, т.к. стал их наконец нормально понимать и без них сейчас просто никуда...
-
semya
Ok
-
semya
Разобрался, почему у меня все-таки не кушался .*
Все дело было в модификаторе /s, который разрешает точке соответствовать \\n
/^.*/is теперь правильно захватывает заголовок.
Нашел утилитку для отладки регекспов. Вернее она у меня была, просто вспомнил про нее. Куда закинуть?
PS: Кстати, средства отладки есть в перловых редакторах Komodo и OptiPerl, но там они как-то глючно работают.
-
Интересно. Теперь дальше застрял. Я вытянул только титульную страницу, т.е. оглавление с ссылками на сами новостные странички. Как мне теперь их обрабатывать? Каждую страничку по ссылке тоже нужно коцать. Какая методика тут?
-
Народ, ну подскажите с какой стороны подступиться, а?
Т.е. ссылки все я из странички выберу, а что с ними дальше делать?
1. Пройтись по каждой и содержимое каждой добавлять ниже (расставляя метки), а ссылку менять на метку? Получится наверно громоздко и долго грузиться... И получится ли вообще.
2. Изенить ссылки таким образом, чтобы они шли не прямо на страничку, а через ф-цию, которая коцает?
Если первое я примерно представляю как сделать, то что делать со вторым ума пока не приложу?
Первый вариант мне кажется тут не совсем подходит.
Помогите плиз, а?
semya, ты куда пропал? Нужна твоя помощь... Плиззз :)
Спасибо!
-
а есть ли тебе смысл выбирать сначала весь список, а потом ходить по новостям, ты посмотри более подробно на ссылку, мож там что-то типа news.php?id=news_id и тебе только достаточно смотреть какую новость ты еще не выбирал и забирать ее не мучаюясь с оглавлением? а иначе конечно придется ходить по каждой новости и забирать ее, и я уверен, что там глобальным поиском по тексту страницы с помощью preg_match_all() можно одним запросом выбрать все новости... кидай в приват или по асе адрес и что надо выбрать, я тебе скрипт накатаю, но тока завтра...
П.С. - ты вроде обещался утилитку для регэкспов... я тебе мыло в персональные сообщения кинул...