Под крышей DOM-a моего...(Парсинг HTML и рядом с ним)

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Под крышей DOM-a моего...(Парсинг HTML и рядом с ним)

Сообщение Alex2013 » 03.10.2021 14:55:46

В общем на повестке дня три вопроса :
1 Как при использовании TDomNodeList получить содержимое произвольного контейнера (ноды) в виде куска исходного HTML кода?
(Полезно в отладке и вообще ингода проще конечную операцию извлечения данных "в ручном режиме" делать, а не писать что-то сомнительное вроде NodeList[i].ChildNodes[1].ChildNodes[1].ChildNodes[3].ChildNodes[1].ChildNodes[0].TextContent )

2 Как установить компонент InternetTools в Лазарусе 2.0.8 и 2.0.10 ?
(Простота использования подкупает ... да там есть автономный simplehtmlparser.pas но примеров именно его использования я не обнаружил )

3 Почему httpclient.Free; сразу после чтения httpclient.Get ИНОГДА выдает ошибку? (Убрал httpclient.Free; а httpclient сделал глобальной переменной проблемы резко исчезли )
Код: Выделить всё
httpclient := TFPHttpClient.Create(nil);
httpclient.AddHeader('User-Agent',
   'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0');
try
   st:=TMemoryStream.Create;
    httpclient.Get(S_URL,St);
    if st <> Nil then begin
    St.Seek(0, soFromBeginning);
    Image1.Picture.LoadFromStream(ST);
   end;
   finally
   St.Free ;
  httpclient.Free;
end;
Alex2013
долгожитель
 
Сообщения: 2940
Зарегистрирован: 03.04.2013 11:59:44

Re: Под крышей DOM-a моего...(Парсинг HTML и рядом с ним)

Сообщение Ichthyander » 04.10.2021 18:42:26

3. Именно сразу после GET или как в коде выше? Если сразу после GET, то неудивительно. Если как в коде, то нужна отладка, чтобы понять. А собственно какая ошибка?
P.S. Ключевое слово try нужно поместить после строчки с st:=TMemoryStream.Create;
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 675
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Под крышей DOM-a моего...(Парсинг HTML и рядом с ним)

Сообщение Alex2013 » 04.10.2021 20:18:20

1 "как в коде выше"
2 Ошибка мало информативная (Обычные проблемы с указателем ) .
Есть идея что St.Free ; и httpclient.Free; нужно просто поменять местами (Пока не пробовал ).
(Логика примерно такая: httpclient.Get(S_URL,St); (или Image1.Picture.LoadFromStream(ST);) может по идее частично выполнятся в другом потоке и в результате httpclient.Free; пытается закрыть эту сессию, а потоку уже "кирдык". )
Зы
Удивило что ошибка влезает только при чтении определенных картинок (Миниатюры к фильмам (большая чать ошибок не вызывает ) с ex-fs.net - именно эта кстати из тех что глючит ) . :shock:
Зы Зы
Ichthyander писал(а):P.S. Ключевое слово try нужно поместить после строчки с st:=TMemoryStream.Create;

Ок Проверю ! (Спасибо за совет. )

Добавлено спустя 23 минуты 7 секунд:
Так работает но чуть подтормаживает
Код: Выделить всё
httpclient := TFPHttpClient.Create(nil);
httpclient.AddHeader('User-Agent',
   'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0');
st:=TMemoryStream.Create;
try
    httpclient.Get(S,St);
    if st <> Nil then begin
    St.Seek(0, soFromBeginning);
    Image1.Picture.LoadFromStream(ST);
   end;
   finally
  httpclient.Free;
end;
  St.Free ;


(там вот такой тестовый скроллбар ).
Изображение

Так что пока оставил так
Код: Выделить всё
if httpclient= nil then
   httpclient := TFPHttpClient.Create(nil);
httpclient.AddHeader('User-Agent',
   'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0');
try
   st:=TMemoryStream.Create;
    httpclient.Get(S,St);
    if st <> Nil then begin
    St.Seek(0, soFromBeginning);
    Image1.Picture.LoadFromStream(ST);
   end;
   finally
     St.Free ;
  end;
Alex2013
долгожитель
 
Сообщения: 2940
Зарегистрирован: 03.04.2013 11:59:44

Re: Под крышей DOM-a моего...(Парсинг HTML и рядом с ним)

Сообщение Ichthyander » 04.10.2021 21:28:55

Alex2013 писал(а):Так работает но чуть подтормаживает

Ну так потому что закачивает картинку в основном потоке. Если хотите, чтобы не подмораживало - закачивайте в отдельном потоке. Само собой со всем ограничениями и правилами работы с многопоточным приложением
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 675
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Под крышей DOM-a моего...(Парсинг HTML и рядом с ним)

Сообщение Alex2013 » 05.10.2021 02:54:49

Ichthyander писал(а):Ну так потому что закачивает картинку в основном потоке. Если хотите, чтобы не подмораживало - закачивайте в отдельном потоке. Само собой со всем ограничениями и правилами работы с многопоточным приложением

Ну можно и так но в рабочем варианте я кэширование с предварительной загрузкой планирую запилить это как-бы понадежнее будет . :idea:
Alex2013
долгожитель
 
Сообщения: 2940
Зарегистрирован: 03.04.2013 11:59:44

Re: Под крышей DOM-a моего...(Парсинг HTML и рядом с ним)

Сообщение Alex2013 » 06.10.2021 18:49:49

Муа-ха-ха ! ДоМ достал !
Самый убойный парсер ...
Код: Выделить всё
function GetSubStr(S,Fs,ES:string):string;
var    i,j:integer;
begin
Result:=''; i:=posEx(FS,s);
If (i >0 ) Then begin
S:= copy(s,i+Length(Fs),Length(s));
j:=posEx(Es,s);
If ( J>0 )  Then
Result:=copy(s,1,j-1);
end ;
  begin   
...
      S:=   GetSubStr(html,'<div class="FullstorySubFormText">','</div>');
end;

:D Шутка !

На самом деле помогло построение ДОМ-дерева из примера . :idea:
https://wiki.freepascal.org/XML_Tutoria ... 2_TreeView
Но какого черта нужно было делать Node.Attributes.Length вместо обычного Count сея тайна велика есть ... :roll:
Alex2013
долгожитель
 
Сообщения: 2940
Зарегистрирован: 03.04.2013 11:59:44

Re: Под крышей DOM-a моего...(Парсинг HTML и рядом с ним)

Сообщение Sharfik » 07.10.2021 15:19:59

А почему Dom?
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 763
Зарегистрирован: 20.07.2013 01:04:30

Re: Под крышей DOM-a моего...(Парсинг HTML и рядом с ним)

Сообщение Alex2013 » 08.10.2021 15:20:33

Просто случайно попался красивый и наглядный пример вот решил разобраться (и все браузеры вроде как основаны на "DOM-технологии" ).
А что есть что-то проще/функциональней/надежней ? "Прямой парсинг" тоже работает но в HTML (XML) много тонкостей и хитростей которые уже учтены в ДОМ. (Хотя реализация DOM в лазарусе довольно странная и капитально разбираться нужно уже с ней...)

Добавлено спустя 1 час 41 минуту 5 секунд:
Нашел частичное решение проблемы "номер 1" из шапки темы.
Но как-то это идейно напоминает "кругосветное путешествие в магазин за хлебушком ". :wink:

Код: Выделить всё
Uses ...XMLWrite;

Function DomNode_XmlToStr(Node: TDomNode):String;
var
sm:TMemoryStream;
SL:TStringList;
Begin
Result:='';
try
SL:=TStringList.Create;
sm:=TMemoryStream.Create;
WriteXML(Node,SM);
  sm.Seek(0, soFromBeginning);
Sl.LoadFromStream(SM);
Result:=Sl.Text;
finally
  sm.Free;
  sl.Free;
end;
end;
Последний раз редактировалось Alex2013 11.10.2021 10:20:01, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2940
Зарегистрирован: 03.04.2013 11:59:44

Re: Под крышей DOM-a моего...(Парсинг HTML и рядом с ним)

Сообщение Alex2013 » 10.10.2021 17:19:33

Новый день - новые глюки ! :wink:
Попробовал включить прокси TFPHTTPClient-е ни один адрес не работает даже локальный тор-прокси из тор браузера!
(127.0.0.1:9150 )
Процедура установки проста как валенок но ничего не работает .
Код: Выделить всё
procedure SetProxy(AHttp: TFPHTTPClient; const AUrl: string);
var
    i: Integer;
begin

    with AHttp.Proxy do
    begin
        if AUrl <> '' then
        begin
            i := Pos(':', AUrl);
            Host := Copy(AUrl, 1, i - 1);
            Port := StrToInt(Copy(AUrl, i + 1, Length(AUrl)));
            UserName := '';
            Password := '';
        end
        else
        begin
            Host := '';
            Port := 0;
            UserName := '';
            Password := '';
        end;
    end;
end;
Alex2013
долгожитель
 
Сообщения: 2940
Зарегистрирован: 03.04.2013 11:59:44

Re: Под крышей DOM-a моего...(Парсинг HTML и рядом с ним)

Сообщение Ichthyander » 11.10.2021 22:34:38

В стейбл версии Лазарус поддержка HTTP прокси не реализована до конца (проверить легко - заглянуть в исходники fphttpclient). Сейчас кажется в транке реализовано. Причем с HTTPs не уверен, что реализовано, но проверьте. В свое время поэтому перешел на synapse. (вернее сделал брокер HTTP клиента). Ну и на всякий случай, Даже если реализовано, то там именно HTTP(s) прокси - не socks!
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 675
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Под крышей DOM-a моего...(Парсинг HTML и рядом с ним)

Сообщение Alex2013 » 12.10.2021 02:27:24

Спасибо за отзыв ! synapse всем хорош но я не умею с его помощь читать HTTPS, но тут новый прикол походу образовался! Пытаюсь читать данные с онлайн плеера "по F12" в браузере удалось выловить прямые ссылки на видео.
Типа таких
https://cloud.cdnland.in/movies/3bb8326 ... 14/720.mp4
https://rubidium.cloud.cdnland.in/movie ... 14/720.mp4

Но как получить их в программе пока не додумался ... есть идея просто запускать тамошний плеер и вытянуть лог... Но ту новая проблема: Как получить это самый лог используя стандартный shdocvw_tlb.pas ?
Alex2013
долгожитель
 
Сообщения: 2940
Зарегистрирован: 03.04.2013 11:59:44

Re: Под крышей DOM-a моего...(Парсинг HTML и рядом с ним)

Сообщение Ichthyander » 12.10.2021 12:08:21

Alex2013 писал(а):synapse всем хорош но я не умею с его помощь читать HTTPS

Тут достаточно просто:
1) добавить в uses модуль ssl_openssl (находится в папке с исходниками ararat synapse, соответственно)
2) на всякий случай перед запросом сделать что-то вроде этого:
Код: Выделить всё
aHTTPSend.Sock.SSL.SSLType:=LT_TLSv1_2;
Лишь для того, что по умолчанию версия TLS в синапсе используется устаревшая и многие сайты HTTPS отказывает в таком соединении.
3) Если потребуется (иногда подхватывается системой) добавить библиотеки OpenSSL
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 675
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Под крышей DOM-a моего...(Парсинг HTML и рядом с ним)

Сообщение Alex2013 » 12.10.2021 22:31:45

Спасибо попробую ! (а библиотеки OpenSSL приходится таскать в любом случае)
Но вообще в Виндовс можно сделать "ход конем" и использовать TWebBrowser ( точнее его реинкарнацию shdocvw_tlb.pas) "для всего" .

Добавлено спустя 17 часов 47 минут 40 секунд:
Собрал простой Сниффер в Лазарусе (может кому-то пригодится, требует установки WinPcap_4_1_3.exe (https://www.winpcap.org/install/default.htm) и запуска от имени администратора )
https://disk.yandex.ua/d/RhrXA0ieIg5cqw
Работает но для моих целей к сожалению не годится! Мене нужно что-то вроде хука на метод Get для перехвата всех URL запрашиваемых TWebBrowser . ( без WinPcap , запуска от имени администратора и сложного анализа пакетов )
Alex2013
долгожитель
 
Сообщения: 2940
Зарегистрирован: 03.04.2013 11:59:44

Re: Под крышей DOM-a моего...(Парсинг HTML и рядом с ним)

Сообщение Ichthyander » 13.10.2021 16:32:59

Alex2013 писал(а):Спасибо попробую ! (а библиотеки OpenSSL приходится таскать в любом случае)
Но вообще в Виндовс можно сделать "ход конем" и использовать TWebBrowser ( точнее его реинкарнацию shdocvw_tlb.pas) "для всего" .

Добавлено спустя 17 часов 47 минут 40 секунд:
Собрал простой Сниффер в Лазарусе (может кому-то пригодится, требует установки WinPcap_4_1_3.exe (https://www.winpcap.org/install/default.htm) и запуска от имени администратора )
https://disk.yandex.ua/d/RhrXA0ieIg5cqw
Работает но для моих целей к сожалению не годится! Мене нужно что-то вроде хука на метод Get для перехвата всех URL запрашиваемых TWebBrowser . ( без WinPcap , запуска от имени администратора и сложного анализа пакетов )

Почему Паскалисты в упор не хотят юзать GitHub? Ведь залить туда труда не составит. Неудивительно, что такой рейтинг у Паскаля на GitHub, многие даже аккаунта не имеют там ((
P.S. Как архив на Я.диске точно никому не пригодится: это неудобно и он потеряется в итоге

Добавлено спустя 1 минуту 31 секунду:
Alex2013 писал(а):Мене нужно что-то вроде хука на метод Get для перехвата всех URL запрашиваемых TWebBrowser

Тебе нужен скорее SEF4Delphi
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 675
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Под крышей DOM-a моего...(Парсинг HTML и рядом с ним)

Сообщение Alex2013 » 13.10.2021 17:09:47

Ichthyander писал(а):Почему Паскалисты в упор не хотят юзать GitHub? Ведь залить туда труда не составит. Неудивительно, что такой рейтинг у Паскаля на GitHub, многие даже аккаунта не имеют там ((
P.S. Как архив на Я.диске точно никому не пригодится: это неудобно и он потеряется в итоге

1 Не того уровня проект ( Но идея звести свой уголок на GitHub в принципе уже давно созревает у меня в голове )
2 Все мои ссылки с Яндекс-диска начиная с 2013 года живы .
3 Конкретно Сниффер просто простой порт чужого кода на дельфи (смотри статью: Создание сниффера на Delphi) с дельфи и ничего ценного из себя не представляет просто "к слову пришлось".
Ichthyander писал(а):Тебе нужен скорее SEF4Delphi

В смысле СEF4Delphi ? Идея хороша но примерно +200 мБ (и это еще самый минимум! ) к размеру простой программы смотрятся как-то напряженно
Alex2013
долгожитель
 
Сообщения: 2940
Зарегистрирован: 03.04.2013 11:59:44

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23

Рейтинг@Mail.ru