Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > PHP: Сеть > Сграбить часть содержимого страницы |
Автор: Aliance 13.5.2006, 18:51 | ||
Доброго времени суток. Задача такая: с помощью cURL, sockets, fopen, file_get_contents (или любым другим способом) получить содержимое страницы и выдезать только часть между:
И далее работать с этим текстом. Как это осуществить и чем лучше? Их вышеперечисленного не работал ниразу с cURL, но говорят они лидеры в этом :-) Что посоветуете? |
Автор: Mal Hack 13.5.2006, 19:41 |
Это сразу выкинь. fsockopen для начала. В поискепоюзай. |
Автор: Aliance 13.5.2006, 20:17 |
Ну с ними умею. А вот с cURLами не работал. Советуешь для данной задачи что использовать? Я могу сокетами получить содержимое всей страницы, а как только ее часть, подскажи плз ) |
Автор: Aliance 13.5.2006, 20:44 | ||
Да, он не стандартизирован. Единственное что абсолютно точно - нужный мне кусок находится между комментариями, которые я привел в первом посту. Так как мне их выцепить-то? |
Автор: Mal Hack 13.5.2006, 20:58 |
Регулярками ![]() |
Автор: Aliance 13.5.2006, 21:43 | ||
Да это понятно, но не выходит у меня. Вот что пишу, но явно что бред...
В общем мне нужно получить это: TEST===TEST===TEST===TEST |
Автор: Mal Hack 13.5.2006, 21:57 | ||
|
Автор: Aliance 13.5.2006, 22:19 | ||||
Спасибо, помогло. А реально ли усовершенствовать это так: возьмем переменную $mas[0][0] и сделаем такую вещь:
Далее берем первый элемент - $new_mas[0], его текст таков:
И нужно получить все выделенные фрагменты. Тут я вообще сомневаюсь, что такое возможно. Текст большой (я все пробелы и табуляцию удалил, их полно перед строчками), регулярками наверное никак... |
Автор: Mal Hack 13.5.2006, 22:45 | ||
Можно вычленить и такое. Только тут лучше будет текст целиком прогнать, как есть. При этом, важно чтобы код HTML был хотя бы валидным с точки зрения синтаксиса. Когда я писал подцветку, я все то сделал. Тут несколько попроще...
А вот значения, уже так просто не получится... Тут уже надо конкретизировать как-то. |
Автор: Aliance 13.5.2006, 23:05 |
А уточнять нечего ![]() Вот, единственное что менется - это выделенные слова. Их-то мне и нужно заполучить. Есть много тсраниц, на каждой от 0 до бесконечности таких блоков. Я планировал циклом прокрутить, получить все эти слова и забить в БД свою, выполнять скрипт кроном. Впринципе сейчас с твоей помощью у меня сам этот текст есть, но если я его так буду вставлять на страницу - то это никак не подойдет под мой дизайн. Хотелось бы иметь отдельные необходимые слова. Очень нужна это вещь, просто без нее не пишется ничего другое, т.к. на этом все основано ![]() Добавлено @ 23:06 Может по строчкам просто рзбивать сперва? |
Автор: Mal Hack 13.5.2006, 23:26 |
Aliance, дай линк откуда надо стырить. В принципе все можно сделать. |
Автор: Aliance 14.5.2006, 00:15 |
Дык линков много. Могу дать парочку, поймешь думаю закономерность :-) http://capitalcity.combats.ru/encicl/crutch.html http://capitalcity.combats.ru/encicl/shirt.html Делаю энциклопедию предметов из этой игры. Т.к. предметы изменяються/добавляются + их очень много - в ручную заносить в БД - это непосильная работа. |
Автор: Mal Hack 14.5.2006, 01:54 | ||
|
Автор: Aliance 14.5.2006, 10:46 | ||
Пустой массив получается ![]()
|
Автор: Mal Hack 14.5.2006, 13:29 | ||
|
Автор: Aliance 14.5.2006, 15:40 |
Все работает почти идеально! :-) Пойду писать, какие будут вопросы по ходу, буду задавать! ЗЫ: получай, гений, +1 ![]() |
Автор: Aliance 14.5.2006, 17:18 | ||||||||||
Итак, совместил 2 кода, вот он:
Все выходит, но это лишь первый элемент ($mas[0][0]). В перспективе я бы хотел циклом перебирать и резать все вхождения ($mas[0][$i]). Проблем нет, кроме одной: в первый элемент имеет 2 и 3 лишние строчки, которые мешают. Вот они:
Их нужно вырезать, думаю. Вот значение переменной $mas[0][0] для данного кода:
Она получается путем этой строчки кода из всего исходного текста кода:
Далее мы делит эту переменную с помощью функции explode (в данном случае получается 2 элемента):
Если не очень понятно изъяснился - скажите, напишу полностью код с циклом и покажу чего именно не получается. |
Автор: Wowa 14.5.2006, 17:23 | ||||||
Mal Hack, чем не нравится file_get_contents ? Добавлено @ 17:30
Да, два.. Но использовать <br /> разграничителем ненадежно. Попробуй может хотя бы так, чтобы на переходы строк еще ориентироваться.
А теперь доступ через $data[0] и $data[1] Или можешь сразу в переменные, а не в массив: list($mydata1, $mydata2) = explode("\n<br />\n", $mas[0][0]); |
Автор: Aliance 14.5.2006, 18:03 |
Wowa, твой код с переменной $to_del не подходит. Так как эти строчки меняются. А на счет так тут да, так канечно лучше, но посмотри в исходники страницы этой: http://capitalcity.combats.ru/encicl/crutch.html Там все сделано именно так, чтобы программисты могли ее парсить. Обычные переносы там такие: <BR>, а разделитель именно такой: <br /> Но вообще тут я с тобой согласен ![]() Вообще страницы там более менее одинаковые. Меняются данные, которые мне и нужно заполучить. Если бы не эти строчки - все бы было супер :-( |
Автор: Mal Hack 14.5.2006, 18:07 | ||
Работает с удаленными файлами только при определенных настройках ПХП. А это дыра в безопасности. Тебе вообще не так делать надо было ![]() Вот:
|
Автор: Wowa 14.5.2006, 18:14 | ||
Должно быть включено fopen wrappers в php.ini. Не представляю, какая тут может быть дыра.. |
Автор: Aliance 14.5.2006, 18:21 | ||
Mal Hack, не могу получить это:
Хотя вот здесь мы это получили: http://forum.vingrad.ru/index.php?showtopic=95933&view=findpost&p=730640 |
Автор: Mal Hack 14.5.2006, 18:29 | ||
|
Автор: Aliance 14.5.2006, 18:42 | ||
Вот конечный, работающий вариант:
|
Автор: regret 22.7.2006, 21:24 |
вот блин!!! ищу в реале таких как ты для ![]() (код скопировал себе в архивчеГ- пригодитсо ![]() |
Автор: Guest 9.10.2006, 14:14 |
Уважаемые господа, не могли бы вы "прочитать" конструкцию типа (.*?) или (.+?), так вот как бы логика ястна, но не везде. И ещё в некоторых местах используется ключ #s - "<\!\-\-\sEnd\sof\stext\s\-\->#s" зачем он здесь и как бы он работал без него? Спасибо, извеняюсь за ламерсие вопросы, но не мог найти оввет на них в другом месте |
Автор: Aliance 9.10.2006, 14:50 |
Первое - это управление жадностью квантификаторов. Про них читай в книгах о регульрных выражениях. Второе - это модификатор s, обозначабщий строчность данных, где происходит поиск/замена. О них читай там же. |
Автор: Guest 9.10.2006, 15:28 |
Большое спасибо, теперь буду знать что искать ![]() |
Автор: dvska 17.10.2006, 15:53 |
Немного оффтоп, потому как не PHP (а Python), но Посмотрите какая рульная либа: http://www.crummy.com/software/BeautifulSoup/documentation.html |
Автор: pnd_ku 20.9.2007, 21:12 |
Вечер добрый! В получении странички по сокету есть подводный камень, я не знаю как его обойти. Камень этот в размере буфера. Штука такая - если буфер больше чем примерно 2*1024 то в контенте странички появляются строчки такова вида \r\n[a-f0-9]{4}\r\n - в общем шестнадцатиричное число, окруженное переносами строк. Если же буфер меньше чем 2*1024, то периодически теряется по символу из получаемых данных. Как обойти, и что это вообще за такое я так и не осознал. Может кто встречался, и знает причину/решение? Спасибо! |
Автор: sTa1kEr 21.9.2007, 10:16 |
pnd_ku, это называется в протоколе HTTP 1.1 http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.6.1. Если сервер передал заголовок "transfer-coding: chunked", то данные будут передаваться не одним потоком, а по блокам с динамическим размером. hex числа - это длина следующего блока. Данные будут передаваться пока длина блока не будет 0. Если не хотите получать данные по блокам, то используйте протокол HTTP 1.0 |
Автор: pnd_ku 21.9.2007, 12:13 |
Спасибо большое, а то я уж и не знал что подумать ![]() |