Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 23.04.2015
Сообщений: 138
1

Парсинг в WebBrowser

09.09.2015, 23:29. Просмотров 3815. Ответов 20


Как в tWebBrowser возможно спарсить текст? Даже представить себе не могу как написать код можно.
Например от <li>Донат счет<span> до </span>, то есть мне нужно получить 0 руб.
HTML5
1
<li>Донат счет<span>0 руб.</span>
Вот так выглядит вся статистика которую нужно спарсить и вывести в memo

Парсинг в WebBrowser


Кто может помочь, как это сделать?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.09.2015, 23:29
Ответы с готовыми решениями:

Парсинг с сайта через WebBrowser
Нужно спарсить прокси с одного сайта. Там стоит похоже защита от DDOS поэтому обычными методами не...

Парсинг через WebBrowser
Вопрос банальный, но все же. С рейтинговой системы ТО мне нужно спарсить значения. Например -...

Правильный парсинг ссылок со страницы в WebBrowser
Вот мой фигокод: Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles...

Парсинг страницы в Webbrowser выдает ошибку
В фоновом потоке, загружаю страницу webbrowser.navigate Пытаюсь получить загруженный документ...

20
58 / 48 / 25
Регистрация: 17.12.2013
Сообщений: 221
10.09.2015, 03:55 2
Сначала это.
Потом это.
1
0 / 0 / 0
Регистрация: 23.04.2015
Сообщений: 138
10.09.2015, 14:23  [ТС] 3
Цитата Сообщение от KMSNasgool Посмотреть сообщение
Сначала это.
Потом это.
Все прочитал, но так и не понял как это может мне помочь с парсом в WEbBrowser
0
2646 / 2269 / 278
Регистрация: 24.12.2010
Сообщений: 13,725
10.09.2015, 14:54 4
Цитата Сообщение от Weiz Посмотреть сообщение
парсом в WEbBrowser
Либо ты поручаешь парсинг документа веббраузеру и не лезешь при этом в html-текст документа, а обращаешься к DOM, построенной браузером в результате выполненного им разбора html-текстов

Либо ни о каком "парсе в в WEbBrowser" не может идти речь - он взял с сервера и отдал тебе html-текст (на это его миссия закончена), а дальше ты сам ищешь в этом тексте то что тебя интересует, в т.ч. предложенными средствами обработки рег.выражений

Выбирай)
1
0 / 0 / 0
Регистрация: 23.04.2015
Сообщений: 138
10.09.2015, 14:55  [ТС] 5
Indy мне не поможет, нужно как-то через WebBrowser
0
2646 / 2269 / 278
Регистрация: 24.12.2010
Сообщений: 13,725
10.09.2015, 15:16 6
Объясняю на огурцах отличие Indy от браузера:

IdHTTP подключается к веб-серверу по указанному ему тобой URL, делает запрос документа, получает html-текст этого документа и отдает тебе. Всё, больше он ничего не делает. Что хошь, то и делай с этим текстом - хошь парси его, выковыривая оттуда интересующие тебя фрагменты текста, хошь на булку намазывай)

Браузер делает все то что делает IdHTTP
плюс хранит этот текст у себя внутри до особого распоряжения забыть его
плюс парсит этот html-текст, находит там ссвлки на скрипты и пр. и если надо грузит их с указанным в тексте ссылкам
плюс запускает загруженные скрипты на выполнение
плюс из html-текста строит DOM - объектную модель документа
плюс визуализирует DOM для показа пользователю
плюс организует интерактивное взаимодействие пользователя с визуализированным документом
плюс дохрена еще чего делает, нужного и ненужного для тебя в дан.случае)

У тебя есть выбор - попросить браузер выдать тебе загруженный им html-текст и далее париться с этим текстом самостоятельно
или обратиться к DOM, как к готовому результату разбора браузером этого html-текста, при этом о существовании html-текста можно смело забыть вообще - он попросту нах не нужен, потому как вся инф-ция из него уже разложена по полочкам в построенной браузером DOM.
1
39 / 39 / 11
Регистрация: 05.09.2015
Сообщений: 262
10.09.2015, 15:26 7
В TWebBrowser это строго говоря не парсинг, а поиск элементов (навигация) по DOM.
Скриншота тут недостаточно. Нужно смотреть код страницы.
1
2646 / 2269 / 278
Регистрация: 24.12.2010
Сообщений: 13,725
10.09.2015, 15:30 8
те самые скрипты, которые браузер загрузил и запустил на выполнение, взаимодействуют с документом именно через DOM - добавляют объекты документа, изменяют и удаляют их.
С учетом изменений DOM, произведенных скриптами, первоначальный html-текст каждого из объектов в отдельности и документа в целом, может преобразиться до неузнаваемости, вплоть до абсолютно другого.
1
0 / 0 / 0
Регистрация: 23.04.2015
Сообщений: 138
10.09.2015, 15:35  [ТС] 9
Цитата Сообщение от mss Посмотреть сообщение
Либо ты поручаешь парсинг документа веббраузеру и не лезешь при этом в html-текст документа, а обращаешься к DOM, построенной браузером в результате выполненного им разбора html-текстов
Либо ни о каком "парсе в в WEbBrowser" не может идти речь - он взял с сервера и отдал тебе html-текст (на это его миссия закончена), а дальше ты сам ищешь в этом тексте то что тебя интересует, в т.ч. предложенными средствами обработки рег.выражений
Выбирай)
Есть пример кода как вырезать нужный мне элемент, и например вывести его в memo?

http://www.diamondrp.ru/Личный-кабинет.html
Login Banri_Tada
Pass umka911
Server Onyx
0
2646 / 2269 / 278
Регистрация: 24.12.2010
Сообщений: 13,725
10.09.2015, 15:50 10
Объясни нахрена тебе html-текст ?)
Ты поручил парсить его браузеру - так и пусть он занимается этим текстом, разбирая его и раскладывая по полочкам в DOM !

Как он закончит, ты просто обращаешься к браузеру "а ну дай мне текст такого-то конкретно элемента" - и он передаст тебе твою вожделенную строку "0 руб", где бы она ни находилась в html-тексте

Ты же читая подпиcь кнопки Button.Caption на своей форме Form не заботишься о том откуда и как эта кнопка появилясь на форме ? Не заботишься - за тебя это делает VCL, прочитав и разобрав текст dfm-документа и построив Объектную Модель Формы, и тебе пофигу как она это делает.

Ну так и в случае с браузером все тоже самое - ты говоришь ему откуда взять формально описание будущего документа (URL), а он делает все остальное, предоставляя тебе возможность общаться с построенным (и визуализированным) им документом в виде иерархии объектов на уровне св-в, методов и событий этих объектов, а не на уровне их формального html-описания
1
0 / 0 / 0
Регистрация: 23.04.2015
Сообщений: 138
10.09.2015, 16:31  [ТС] 11
Цитата Сообщение от mss Посмотреть сообщение
Объясни нахрена тебе html-текст ?)
Ты поручил парсить его браузеру - так и пусть он занимается этим текстом, разбирая его и раскладывая по полочкам в DOM !
Как он закончит, ты просто обращаешься к браузеру "а ну дай мне текст такого-то конкретно элемента" - и он передаст тебе твою вожделенную строку "0 руб", где бы она ни находилась в html-тексте
Ты же читая подпиcь кнопки Button.Caption на своей форме Form не заботишься о том откуда и как эта кнопка появилясь на форме ? Не заботишься - за тебя это делает VCL, прочитав и разобрав текст dfm-документа и построив Объектную Модель Формы, и тебе пофигу как она это делает.
Ну так и в случае с браузером все тоже самое - ты говоришь ему откуда взять формально описание будущего документа (URL), а он делает все остальное, предоставляя тебе возможность общаться с построенным (и визуализированным) им документом в виде иерархии объектов на уровне св-в, методов и событий этих объектов, а не на уровне их формального html-описания
Найти на странице 0 руб. я могу, но так постоянно не будет, значение будет менять, и как тогда искать и вывести донат счетчик?

Добавлено через 22 минуты
Нашел новый способ все таки работы с Indy, нужно сохранить страницу в *html и парсить ее
Только как ее сохранить?
0
2646 / 2269 / 278
Регистрация: 24.12.2010
Сообщений: 13,725
10.09.2015, 16:36 12
Да не надо тебе искать "хз скольку руб" !)
Нужно один раз найти в DOM объект, чтение св-ва которого даст актуальный текст, тот что ты видишь в окне браузера в рез-те навигации указанной страницы)

Добавлено через 1 минуту
Цитата Сообщение от Weiz Посмотреть сообщение
новый способ все таки работы с Indy, нужно сохранить страницу в *html и парсить ее
Сказка про белого бычка)
Ты ведь уже задавал вопрос почему текст, загруженный Индейцем, отличается от текста, загруженного браузером..
1
39 / 39 / 11
Регистрация: 05.09.2015
Сообщений: 262
10.09.2015, 17:27 13
Хотел помочь, но чего-то в Делфи7 не логинится из под TWebBrowser, пишет мол какой-то скрипт сломался.
Странно, с Оперы и даже с IE всё нормально...

А у вас какая Делфи? Логинится именно из TWebBrowser? Могу набросать пример вслепую.
1
0 / 0 / 0
Регистрация: 23.04.2015
Сообщений: 138
10.09.2015, 23:34  [ТС] 14
Цитата Сообщение от UI-Maker Посмотреть сообщение
Хотел помочь, но чего-то в Делфи7 не логинится из под TWebBrowser, пишет мол какой-то скрипт сломался.
Странно, с Оперы и даже с IE всё нормально...
А у вас какая Делфи? Логинится именно из TWebBrowser? Могу набросать пример вслепую.
Авторизацию я писал через Indy, и все получилось, но исходный код не весь отображается.
Цитата Сообщение от Weiz Посмотреть сообщение
http://www.diamondrp.ru/Личный-кабинет.html
Login Banri_Tada
Pass umka911
Server Onyx
Данные для входа в личный кабинет

Добавлено через 5 минут
Пользуюсь Delphi xe4
0
241 / 191 / 94
Регистрация: 01.05.2015
Сообщений: 732
10.09.2015, 23:39 15
Weiz, я вам ответил на другом форуме
0
39 / 39 / 11
Регистрация: 05.09.2015
Сообщений: 262
11.09.2015, 00:58 16
Лучший ответ Сообщение было отмечено Weiz как решение

Решение

Кнопка не в теге form, а вызывает её submit через JavaScript. А скрипт сломался в стареньком IE. Программно submit можно сделать, это только мышкой не нажималось.

На первой форме TWebBrowser по имени WB и две TButton:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
Const
      IID_IHTMLElementRender: TGUID = '{3050F669-98B5-11CF-BB82-00AA00BDCE0B}';
 
Type
      IHTMLElementRender = Interface(IUnknown) ['{3050F669-98B5-11CF-BB82-00AA00BDCE0B}']
            Function DrawToDC(DC: HDC): HResult; StdCall;
            Function SetDocumentPrinter(bstrPrinterName: WideString; DC: HDC): HResult; StdCall;
      End;
 
...
 
      ...
      Private { Private declarations }
            Function CheckVariant(V: OleVariant): BooLean;
      ...
 
...
 
Implementation
 
Uses MSHTML, Unit2;
 
...
 
Function TForm1.CheckVariant(V: OleVariant): BooLean;
Begin
Result:=Not (VarIsNull(V) Or VarIsEmpty(V) Or VarIsClear(V));
End;
 
Procedure TForm1.FormCreate(Sender: TObject);
Begin
WB.Navigate('http://www.diamondrp.ru');
End;
 
Procedure TForm1.Button1Click(Sender: TObject);
Var i, j: Integer; Element, Collection, Form, Options, Captcha: OleVariant; CaptchaImg: TBitmap; Render: IHTMLElementRender;
Begin
WB.Navigate('http://www.diamondrp.ru/Личный-кабинет.html');
While WB.ReadyState<>READYSTATE_COMPLETE Do
      Application.ProcessMessages;
Element:=WB.OleObject.Document;
Element:=Element.getElementById('content_mini');
Form2.Image1.Picture.Graphic:=Nil;
Form2.Edit1.Text:='';
If CheckVariant(Element) Then
      Begin
      Collection:=Element.GetElementsByTagName('form');
      If CheckVariant(Collection) Then
            Begin
            Form:=Collection.Item(0);
            Collection:=Form.All;
            If CheckVariant(Collection) Then
                  For i:=0 To Collection.Length-1 Do
                        Begin
                        Element:=Collection.Item(i);
                        If Element.ID='nickname' Then
                              Element.Value:='Banri_Tada'; // Ваш логин
                        If Element.ID='password' Then
                              Element.Value:='umka911'; // Ваш пароль
                        If Element.ID='captcha' Then
                              Captcha:=Element; // Запомним окошко ввода капчи
                        If Element.ID='captchai' Then
                              Begin // Капча (само изображение)
                              If IHTMLElement2(TVarData(Element).VUnknown).QueryInterface(IID_IHTMLElementRender, Render)=S_OK Then
                                    Begin
                                    CaptchaImg:=TBitmap.Create;
                                    CaptchaImg.Width:=Element.offsetWidth;
                                    CaptchaImg.Height:=Element.offsetHeight;
                                    Render.DrawToDC(CaptchaImg.Canvas.Handle);
                                    Form2.Image1.Picture.Graphic:=CaptchaImg;
                                    CaptchaImg.Free;
                                    End;
                              End;
                        If Element.ID='server' Then
                              Begin
                              Options:=Element.GetElementsByTagName('option');
                              If CheckVariant(Options) Then
                                    For j:=0 To Options.Length-1 Do
                                          Begin
                                          Element:=Options.Item(j);
                                          If Element.Value='server6' Then
                                                Element.Selected:=True; // Ваш сервер
                                          End;
                              End;
                        End;
            If Form2.ShowModal=mrOk Then
                  Begin
                  Captcha.Value:=Form2.Edit1.Text; // Ввод капчи
                  Form.Submit;
                  End;
            End;
      End;
End;
 
Procedure TForm1.Button2Click(Sender: TObject);
Var i, j: Integer; Element, Collection: OleVariant;
Begin
WB.Navigate('http://www.diamondrp.ru/Личный-кабинет.html');
While WB.ReadyState<>READYSTATE_COMPLETE Do
      Application.ProcessMessages;
Element:=WB.OleObject.Document;
Element:=Element.getElementById('content');
If CheckVariant(Element) Then
      Begin
      Collection:=Element.GetElementsByTagName('div');
      If CheckVariant(Collection) Then
            For i:=0 To Collection.Length-1 Do
                  Begin
                  Element:=Collection.Item(i);
                  If Element.ClassName='user_stats' Then
                        Begin
                        Collection:=Element.GetElementsByTagName('ul');
                        If CheckVariant(Collection) Then
                              For j:=0 To Collection.Length-1 Do
                                    Begin
                                    Element:=Collection.Item(j);
                                    If Element.ClassName='right' Then
                                          Begin
                                          Collection:=Element.GetElementsByTagName('li');
                                          If CheckVariant(Collection) Then
                                                Begin
                                                Element:=Collection.Item(Collection.Length-1); // Последний элемент ...
                                                ShowMessage(Element.innerHTML); // ... это то что вы искали.
                                                End;
                                          Exit;
                                          End;
                                    End;
                        Exit;
                        End;
                  End;
      End
End;
На второй форме TButton, TEdit и TImage:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
Procedure TForm2.FormCreate(Sender: TObject);
Begin
Position:=poMainFormCenter;
Image1.AutoSize:=True;
Button1.ModalResult:=mrOk;
End;
 
Procedure TForm2.Edit1KeyDown(Sender: TObject; Var Key: Word; Shift: TShiftState);
Begin
If Key=13 Then
      ModalResult:=mrOk;
End;
2
0 / 0 / 0
Регистрация: 23.04.2015
Сообщений: 138
12.09.2015, 14:57  [ТС] 17
Diamond CHecker.rar

Посмотрите пожалуйста, может у меня не правильная авторизация через IdHTTP?
0
39 / 39 / 11
Регистрация: 05.09.2015
Сообщений: 262
13.09.2015, 13:12 18
Добавление нормальной кнопки Submit:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Procedure TForm1.Button3Click(Sender: TObject);
Var i: Integer; DOM, Form, Element, Collection, NewElement: OleVariant;
Begin
WB.Navigate('http://www.diamondrp.ru/Личный-кабинет.html');
While WB.ReadyState<>READYSTATE_COMPLETE Do
      Application.ProcessMessages;
DOM:=WB.OleObject.Document;
Element:=DOM.getElementById('content_mini');
If CheckVariant(Element) Then
      Begin
      Collection:=Element.GetElementsByTagName('form');
      If CheckVariant(Collection) Then
            Begin
            Form:=Collection.Item(0);
            Collection:=Form.GetElementsByTagName('div');
            If CheckVariant(Collection) Then
                  For i:=0 To Collection.Length-1 Do
                        Begin
                        Element:=Collection.Item(i);
                        If Element.ClassName='captcha' Then
                              Begin
                              NewElement:=DOM.createElement('input');
                              NewElement.setAttribute('type', 'submit');
                              NewElement.setAttribute('value', 'Войти');
                              Element.appendChild(NewElement);
                              Exit;
                              End;
                        End;
            End;
      End;
End;

Не по теме:

appendChild что-то срабатывал не совсем так как ожидал.

0
0 / 0 / 0
Регистрация: 23.04.2015
Сообщений: 138
29.09.2015, 20:27  [ТС] 19
Цитата Сообщение от UI-Maker Посмотреть сообщение
Добавление нормальной кнопки Submit:
Он обновляет страницу, и всех введенных данных нету, и авторизация не проходит
0
39 / 39 / 11
Регистрация: 05.09.2015
Сообщений: 262
01.10.2015, 03:34 20
Это ж пример. Заполнение в другом примере было. Ну закомментируйте переход по ссылке если не нужен, не?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.10.2015, 03:34

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Парсинг данных из WebSocket через webbrowser
Добрый день! Форумчане, решите за меня помогите разобраться или подпихните в какую сторону копать?...

Парсинг web страниц, загруженных в WebBrowser
Добрый день всем. Собственно говоря у меня не вопрос, а просьба растолковать некоторые детали в...

Парсинг и заполнение форм WebBrowser WPF
Вот такого рода исключение ловлю... System.NullReferenceException: &quot;Ссылка на объект не указывает...

Почему не работает многопоточный парсинг через webbrowser?
Привет всем. Я честно говоря фигею. Не пойму что происходит и в чем причина . Делаю программу,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.