Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.08.30;
Скачать: [xml.tar.bz2];

Вниз

TRegExp и парсинг HTML   Найти похожие ветки 

 
NIIL   (2009-07-03 12:10) [0]

Всем доброго дня. Есть необходимость пропарсить кусок HTML. Загружать через TWebBrowser и далее ковырять DOM нет возможности. Исп. стандартные стредства типа Pos то же не улыбвает.
Нашел замечательный класс TRegExp, к сожалению найти инф. о регулярных выр. для него не могу. Нужно из куска html сначала вытащить текст между <Table> </Table>, далее <Tr> </Tr> и т.п. Подскажие выражение для поиска первого с учетом того, что открывающий тег может иметь еще параметры объекта, но все равно закрывается  ">" и без учета регистра по тегам. Заранее спасибо.


 
Palladin ©   (2009-07-03 12:11) [1]


> Исп. стандартные стредства типа Pos то же не улыбвает.

чем же интересно?


 
NIIL   (2009-07-03 12:16) [2]

Слишком много придеться учитывать и фильтровать, да и смысл когда это уже написано в этом классе


 
Palladin ©   (2009-07-03 12:17) [3]

а что там нужно учитывать? таблица одна?


 
NIIL   (2009-07-03 12:18) [4]

Нет не одна, точнее в том куске может быть их несколько и могут идти с разрывом.


 
Kolan ©   (2009-07-03 12:19) [5]


> к сожалению найти инф. о регулярных выр. для него не могу

http://regexpstudio.com/


 
NIIL   (2009-07-03 12:21) [6]

Читал. Пытаюсь вот так для строки, но не выходит:<TR[^>]*[</TR>]*>


 
Palladin ©   (2009-07-03 12:22) [7]

и тебе они все нужны?


 
NIIL   (2009-07-03 12:23) [8]

На самом деле пытаюсь парсить не полные таблицы, а их строки, а потом их ячейки


 
Сергей М. ©   (2009-07-03 12:26) [9]


> найти инф. о регулярных выр. для него не могу


Как это так ?
Класс этот поставляется разработчиком вместе со вполне внятной справкой в chm-формате .. Куда она у тебя потерялась ?)


 
NIIL   (2009-07-03 12:31) [10]

У меня она идет с небольшой справкой hlp формата в которой я не смог найти упоминания о способе получения текста между 2-мя искомыми выражениями. В сети нашел подобное упоминание <TR>(.+)</TR>, но оно к сожалению не проходит. Результат получаю в Match[0] - пуст после выполнения


 
Kolan ©   (2009-07-03 12:46) [11]

<TR>(.+)</TR> должно работать, только надо экранировать спец. символы, например: знак «/».


 
Сергей М. ©   (2009-07-03 12:47) [12]

А, вру .. действительно в формате hlp ..


procedure TForm1.Button5Click(Sender: TObject);
const
 s: String = "<tr>Всякая хрень</tr>";
var
 RegExpr: TRegExpr;
begin
 RegExpr := TRegExpr.Create;
 RegExpr.ModifierI := True;
 RegExpr.Expression := "<TR>(.+)</TR>";
 if RegExpr.Exec(s) then
   ShowMessage(RegExpr.Match[1]);
end;


 
NIIL   (2009-07-03 12:48) [13]

Kolan © Можно поподробнее...
Вот так: <TR>(.+)<"/"TR> или для экранирования в TRegExp свои служ. символы?


 
NIIL   (2009-07-03 12:54) [14]

Понял в чем проблема. Выражение не парсило так как в html коде идет <TR class=...> Как можно расширить условия поиска 1-й метки до символа ">"


 
clickmaker ©   (2009-07-03 12:57) [15]

> Как можно расширить условия поиска 1-й метки до символа
> ">"

так же как и между > и <


 
NIIL   (2009-07-03 13:07) [16]

<TR(.+)>(.+)</TR> - возвращает всю строку от первого вхождения <TR до последнего </TR>, а мне нужно до первого закрытия, ограничить режим жадности, как это написано в мануале и еще хотелось бы получить текст без вхождения поисковых тегов


 
NIIL   (2009-07-03 13:11) [17]

С Жадностью разобрался


 
NIIL   (2009-07-03 13:16) [18]

Все, вроде разобрался! Спасибо всем кто учавствовал


 
NIIL   (2009-07-03 14:37) [19]

И еще. Подскажите перебрать все включения можно через Match[i] или же через ExecNext. При использовании последнего вылетает ошибка отсутсвия процедуры ExecPos. Не понятно как с ней работать.


 
antonn ©   (2009-07-03 14:43) [20]

примерно так:
procedure GetIPList(Str, RegStr: String; LB: TListBox);
var RE: TRegExpr;
   Ulist: TStrings;
   i: Integer;
begin
RE:=TRegExpr.Create;
Ulist:=TStringlist.Create;
try
 RE.Expression:=RegStr;
 if ExecRegExpr(RegStr,Str) then
  if RE.Exec(Str) then begin
    repeat
      LB.Items.Add( RE.Match[0] );
    until not RE.ExecNext;
 end;
finally
 RE.Free;
 Ulist.Free;
end;
end;


 
Сергей М. ©   (2009-07-03 14:46) [21]


> NIIL   (03.07.09 14:37) [19]


ExecNext() возвращает новый список Match[]



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.08.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.004 c
2-1246249539
karlit0
2009-06-29 08:25
2009.08.30
Combobox и Memo


1-1210931798
max1991
2008-05-16 13:56
2009.08.30
содержимое StringGrid в FastReport


6-1205991809
mrfreeman2007
2008-03-20 08:43
2009.08.30
Счетчик посещений


2-1246188747
Guest___
2009-06-28 15:32
2009.08.30
Запуск программы в определенное время


15-1246337441
desc
2009-06-30 08:50
2009.08.30
Общий вопрос по базам данных





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский