|
Вопрос # 3 385/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
Подскажите пожалуйста, как из текста (HTML страницы) извлечь все ссылки и добавить их в ListBox?
Заранее спасибо.
 |
Вопрос задал: IlluminatI (статус: 2-ой класс)
Вопрос отправлен: 9 ноября 2009, 18:47
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, IlluminatI!
абсолютно все будет достаточно сложно. ведь иногда некоторые ссылки формируются динамически жава скриптами.
можно отпарсить вручную регулярными выражениями. Почитайте мою статью Читаем цитаты с bash.org.ru своей программой, там есть все необходимое, разве что регулярное выражение для ссылок написать. (оно там есть, просто надо найти).
вариант два - использовать TWebBrowser и его свойство links. за подробностями - http://www.cryer.co.uk/brian/delphi/twebbrowser/twebbrowser_oleobject.htm#OleObject.Document.Links
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 9 ноября 2009, 19:02
Оценка за ответ: 5
Комментарий к оценке: спасибо, буду изучать
|
Мини-форум вопроса
Всего сообщений: 11; последнее сообщение — 10 ноября 2009, 21:19; участников в обсуждении: 3.
|
min@y™ (статус: Доктор наук), 9 ноября 2009, 19:37 [#1]:
Я писал прогу, которая качает с определённого сайта веб-страницы с картинками. Для того, чтобы узнать имена файлов картинок, требовалось пропарсить HTML, составить список этих файлов и последовательно их скачать. Регулярные выражения там не используюся, но всё же я готов выслать исходники. Если надо - обращайся.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
IlluminatI (статус: 2-ой класс), 9 ноября 2009, 20:25 [#2]:
Давай, в асе появишься, напишу.
|
|
min@y™ (статус: Доктор наук), 9 ноября 2009, 20:48 [#3]:
Появился.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
IlluminatI (статус: 2-ой класс), 9 ноября 2009, 22:28 [#4]:
нашел такой код в инете, не работает, не подскажете почему?
WebBrowser1.Navigate(Edit1.Text);
for i := 0 to Webbrowser1.OleObject.Document.links.Length - 1 do
Listbox1.Items.Add(Webbrowser1.OleObject.Document.Links.Item(i));
|
|
Вадим К (статус: Академик), 9 ноября 2009, 22:52 [#5]:
логично. конечно работать не будет. Если только у Вас не супер быстрый интернет. Дело в том, что метод Navigate асинхронный. То есть он отдал броузеру команду "грузи" и всё. И на тот момент, когда Вы хотите получить список ссылок, он только начал процесс подключения. Понятно?
Что делать.
а) отказаться от вебброузера.
б) вставить цикл, который подождет, пока броузер подгрузит страницу. Это надо делать где то таким корявеньким кодом (ну не предназначен вебброузер для такой работы - либо коряво, либо в отдельный тред, либо по событиям).
WebBrowser1.Navigate(Edit1.Text);
//ждем-с
while WebBrowser1.ReadyState < READYSTATE_INTERACTIVE do
Application.ProcessMessages;
//проверим, что в документ что то подгрузилось.
//а то мало чего, может админ провод вытянул сетевой
if Assigned(WebBrowser1.Document) then
begin
for i := 0 to Webbrowser1.OleObject.Document.links.Length - 1 do
Listbox1.Items.Add(Webbrowser1.OleObject.Document.Links.Item(i));
end;
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 10 ноября 2009, 08:06 [#6]:
while WebBrowser1.ReadyState < READYSTATE_INTERACTIVE do
Application.ProcessMessages; // <--- загрузка CPU = 100%
Лучше уж выкинуть вебброузер.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 10 ноября 2009, 11:06 [#7]:
можно разбавить его sleep'ами и в тред отдельный вставить.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
IlluminatI (статус: 2-ой класс), 10 ноября 2009, 14:05 [#8]:
хорошо, а если этот код вставить в событие OnNavigateComlete? оно в принципе работает, но вот если страницу после него другую загрузить, опять ничего не работает
|
|
Вадим К (статус: Академик), 10 ноября 2009, 14:39 [#9]:
ну все зависит от того, какой код был вставлен. мало чего там понавставляли
Галочка "подтверждения прочтения" - вселенское зло.
|
|
IlluminatI (статус: 2-ой класс), 10 ноября 2009, 19:44 [#10]:
вот этот вот:
WebBrowser1.Navigate(Edit1.Text);
for i := 0 to Webbrowser1.OleObject.Document.links.Length - 1 do
Listbox1.Items.Add(Webbrowser1.OleObject.Document.Links.Item(i));
он работает только для одной страницы %)
|
|
Вадим К (статус: Академик), 10 ноября 2009, 21:19 [#11]:
если в методе OnNavigateComlete эти две строки, то мы снова вернулись к тому, что было.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|