Страница: 1 |
Страница: 1 |
Вопрос: РегЭксп
Добавлено: 07.10.04 17:01
Автор вопроса: Павел | Web-сайт:
Есть регэксп для выдирания из HTML ссылок:
(<a[^>]+href(\s)*=(\s)*((""(?<url>[^""]*)"")|('(?<url>[^']*)')|(?<url>[^\s>]*)))
Надо сделать, чтобы это не считалось ссылкой, если находится внутри
тэгов <Script></Script>.
Как это сделать?
И сюда же, в тему: есть ли какие-нть парсеры HTML, чтоб не сильно
ресурсоемкие были, и могли вот так работать:
- найти все тэги <a> в документе
- в цикле для каждого из них найти позицию и длину значения атрибута
href в документе
Желательно либо стандартный (имеющийся в поставке Win 2k3 или .Net
Fw), либо в виде .Net-библиотеки.
MS HTML это умеет?
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа:
dNW
Вопросов: 30
Ответов: 683
Профиль | | #1
Добавлено: 07.10.04 17:29
1. Наверное придется искать закрывающий </script> вниз от тега <a>
2. Простой перебор с поиском InStr(n,html,"<a" и InStr(n,html,"href"
Номер ответа: 2
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #2
Добавлено: 07.10.04 17:34
Нет, мне такая мутотень не нужна...
Есть уже отлаженная функция по работе со ссылками, к ней только разные
регэкспы из массива подставляются... Поэтому менять функцию я не буду,
иначе для каждого усовершенствования придется наворачивать горы
кода...
Все это можно сделать с помощью регулярных выражений, вопрос только в
том, как именно
Номер ответа: 3
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #3
Добавлено: 07.10.04 18:10
Вот мутотень без регэкспов, но с MS HTML:
Private Sub Form_Load()
WebBrowser1.Navigate "www.yandex.ru"
End Sub
Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
 im webDoc As HTMLDocument
 im docHTML As String
 im numAtags As Integer, i As Integer
 im ARaw As String ' << полное ("outer" значение тэга A в "сыром" виде (со всеми "&" и т.п.)
' Те величины, о которых ты спрашивал:
 im hrefValue As String ' << нормализованное значение тэга HREF - т.е. уже без всяких "&" и т.п.
 im hrefLength As Long ' << длина тэга HREF
 im hrefPos As Long ' << позиция тэга HREF
Set webDoc = WebBrowser1.Document
docHTML = webDoc.All.tags("HTML"(0).outerHTML
numAtags = webDoc.All.tags("A".length
For i = 0 To numAtags - 1
hrefValue = webDoc.All.tags("A"(i).getAttribute("HREF"
If Right$(hrefValue, 1) = "/" Then hrefValue = Left$(hrefValue, Len(hrefValue) - 1)
hrefLength = Len(hrefValue)
ARaw = webDoc.All.tags("A"(i).outerHTML
hrefPos = InStr(1, docHTML, ARaw, vbTextCompare)
 ebug.Print hrefValue, hrefLength, hrefPos
Next
Set webDoc = Nothing
End Sub
По-моему, это не очень сложно...
Номер ответа: 4
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #4
Добавлено: 07.10.04 18:11
А WebBrowser не пойдет?
document.links - коллекция полнных (не относительных) ссылок с закачанной
страницы
Номер ответа: 5
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #5
Добавлено: 08.10.04 08:38
Огромное спасибо to Commanche, именно MS HTML я и воспользуюсь.
Номер ответа: 6
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #6
Добавлено: 08.10.04 12:27
К сожалению, MSHTML мне не подошел.
Он заточен под использование в WebBrowser, и пытается визуализировать
и исполнять документ. А это мне не подходит из-за соображений
производительности и безопасности.
К тому же, если он натыкается на ошибки в скриптах, то выдает свое
окошко об ошибке, которое стандартными методами подавить не удается.
В общем, MSHTML - полная лажа.
Мне бы чистый HTML-парсер, без всяких наворотов...
Номер ответа: 7
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #7
Добавлено: 08.10.04 13:24
Дак а WinSock разве страницу закачать не может? Через 80 порт-то?
Или его из ASP.Net не подключить?
Номер ответа: 8
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #8
Добавлено: 09.10.04 00:48
На самом деле, всё прекрасно реализуется и без ЭУ WebBrowser. У объекта HTMLDocument есть чудный метод: createDocumentFromUrl. Я в том примере использовал WebBrowser для простоты и наглядности - чтоб код примера можно было быстро "закопипэйстить" из форума в бэйсик (пардон за дурацкий сленг).
Не могу согласиться. Это как в старой рекламе: "Не люблю я этих кошек" - "Да ты просто не умеешь их готовить". )
Номер ответа: 9
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #9
Добавлено: 09.10.04 11:32
Что такое WinSock - знаю смутно, зато хорошо знаком с
System.Net.Socket
А какое это вообще имеет отношение к теме?
Номер ответа: 10
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #10
Добавлено: 09.10.04 11:39
MS HTML вообще тесно интегрирован с WebBrowser, иначе бы не
встречались бы куча методов, типичных для браузера IE: scrollto,
scroll, свойства вроде location и т.д.
Кроме того, он вроде бы будет пытаться подгружать из сети файлы,
ссылки на которые есть в документе, хотя не уверен.
И почему-то при нахождении ошибок в синтаксисе клиентских скриптов он
выбрасывает свой собственный MsgBox с предложением отладки, отменить
показ которого стандартными средствами нельзя.
В общем, от своего мнения я не отказываюсь
Проблему решил проще: нашел самодельный более-менее приличный
HTML-парсер с исходниками на C#.