![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Друзья, помогите распарсить одну страницу. Нужно достать заголовки и тексты. Парсить надо вот такой текст
Код HTML:
Мне нужно выбрать из этой массы заголовки, т.е. 'titles'. Например, из этой строчки 'title': 'Купите машину в кредит быстро!', мне нужен только сам заголовок, т.е. Купите машину в кредит быстро! И так все заголовки надо спарсить. Использую модуль RegExpr. Мой код для парсинга: Код:
var RegExp: TRegExpr; StrPage, StrTitle: TStringList; begin RegExp.Expression := '\''title\'':\s\''(.+)\'',\r\n'; if RegExp.Exec(StrPage.Text) then repeat StrTitle.Add(RegExp.Match[1]); Memo1.Lines.Add(RegExp.Match[1]); // для просмотра вывожу заголовки в Memo until not RegExp.ExecNext; end; Код:
StrPage Код:
StrTitle Но при таком рег. выражении, он выводит мне весь текст, т.е. все, что есть, практически. Вот какой получается результат: Код HTML:
Т.е. он выделяет только первый заголовок Машины в кредит от 2,9% в Москве.', и то не полностью, с кавычкой и запятой в конце почему-то. Как мне победить его и заставить его парсить то, что нужно? Потому что, например, на php это рег. выражение работает на УРА. А в Delphi все приобретает совсем иной смысл... Почему так? |
#2
|
||||
|
||||
![]() Вот "ручной" пример на PosEx
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#3
|
||||
|
||||
![]() У вас же чудная структура, которая легко по строкам обрабатывается. Блоки ограниченные {} и имеющие фиксированное количество элементов - мечта для парсера.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 16.07.2014 в 12:33. |
#4
|
|||
|
|||
![]() Alegun, спасибо, посмотрю, что такое!
Страдалецъ, можно поподробнее, как с такими блоками работать? Я с парсингом дел не имел почти что, а сейчас вот появилась такая задача... Как же мне распарсить эти заголовки? |
#5
|
|||
|
|||
![]() Alegun, спасибо!
А ведь и правда можно без рег. выражений здесь обойтись. Только вот не пойму, почему он воспринимает только шаблоны рег. выражения, записанные в Edit1, Edit2. Если в коде это написать, экранировав при этом кавычки, то не работает. Наверное надо не заморачиваться и просто записать этот текст в поля Edit'ов. |
#6
|
||||
|
||||
![]() Да здесь вопрос в экранировке, - можно посмотреть нужный вариант если открыть форму как текст, и там будет такое - '''title'': ''' , работать это и при вводе из-под редактора будет. Покажите пжлст какие титлы нужно выводить (в смысле каков должен быть конечный результат), из первого поста это действие слегка не понятно
Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 17.07.2014 в 07:06. |
#7
|
|||
|
|||
![]() Alegun, Вот такое должно быть выведено
Машины в кредит от 2,9% в Москве. Автокредит от 4% в Москве! Т.е. только тайтлы. Ну их там много, я просто взял кусок кода страницы для примера. Т.е. из под редактора надо так писать, если без объектов на форме, обойтись? ''title'': '' Но ваш вариант работает здорово. ![]() |
#8
|
||||
|
||||
![]() А это разве не JSON? Можно попробовать его библиотекой JSON разбирать, в модных версиях Delphi есть. Всяко надежней, чем самопал.
Не стоит путать форумы с богадельнями. © Bargest |
#9
|
|||
|
|||
![]() Цитата:
Спасибо за совет! Если бы еще умел этой библиотекой пользоваться... Эх... но все равно спасибо! Может быть в будущем пригодится. ![]() |
#10
|
||||
|
||||
![]() Цитата:
Не стоит путать форумы с богадельнями. © Bargest |
#11
|
|||
|
|||
![]() Freeman, спасибо!
У меня теперь еще одна проблема - мне нужно выполнять в цикле множество GET-запросов через IDHTTP. Но бывает так, что они выполняются, но не все - в цикле, например, 300 запросов, а выполняются только 50, - а бывает, что не выполняется запрос. Делаю Sleep(1000) в цикле, но все равно, бывает, не выполняется. В чем может быть проблема? Может стоит отказаться от IdHTTP и использовать, например, обычный веб-браузер и через него получать в цикле все запросы - т.е. HTML-коды каждой страницы по определенному запросу в яндексе? Последний раз редактировалось M.A.D.M.A.N., 21.07.2014 в 16:31. |
#12
|
||||
|
||||
![]() Цитата:
Не стоит путать форумы с богадельнями. © Bargest |
#13
|
||||
|
||||
![]() Можно юзать обычные сокеты и слать текстовый запрос хттп руками. И ждать, когда тебя забанят, т.к. не любят сайты ботов с кучей запросов.
![]() jmp $ ; Happy End! The Cake Is A Lie. |
#14
|
|||
|
|||
![]() Понял, почему, там яндекс каптчу ставит, и эта каптча пять минут висит, а потом можно опять слать запросы )) ну я ставлю sleep(5000) и потом опять пробую достать нужны текст со страницы.
Как раз сейчас пробую, смотрю, сработает ли ![]() |
#15
|
|||
|
|||
![]() Доброго времени суток, друзья!
Помогите, пожалуйста, с решением еще одной проблемы - мне нужно как-то программно задать регион в яндексе на этой странице http://tune.yandex.ru/region/ Т.е. нужно как-то обратиться к элементу "Текстовое окно" и элементу "Кнопка" по событию onclik. Знаю, что нужно использовать метод Post элемента IdHTTP, т.е. я делаю Код:
PostData:=TStringList.Create; PostData.Clear; PostData.Add('class="b-form-input__input"'); PostData.Add('name="region"'); PostData.Add('value="Тула"'); IdHTTPRegion.Post('http://tune.yandex.ru/region/', PostData); Но регион по-прежнему не меняется... Может быть дело в том, что эти элементы каждый раз меняют свои id, т.е. если перезагрузить страницу, например, id текстового поля будет уже отличный от предыдущего сеанса. Или нет? Подскажите, какие параметры здесь ему еще можно задать, чтобы точно обратиться именно к нужному элементу? |