![]() |
![]() |
![]() |
|
Помогите с парсером Html | ☑ | ||
---|---|---|---|---|
0
prorokk
09.07.11
✎
18:25
|
Итак имеем
Процедура КнопкаВыполнитьНажатие(Кнопка) Попытка ЧтениеHTML = Новый ЧтениеHTML; //ЧтениеHTML.ОткрытьФайл("C:\Сканер Epson Perfection V33 (USB 2.0, 4800x9600dpi, A4).html","windows-1251"); ЧтениеHTML.ОткрытьФайл(СсылкаНакаталог+КодТовара,"windows-1251"); ПостроительDOM = Новый ПостроительDOM; ДокументDOM = ПостроительDOM.Прочитать(ЧтениеHTML); ЭлементыTABLE = ДокументDOM.ПолучитьЭлементыПоИмени("dl"); Строки = ЭлементыTABLE[0].ПолучитьЭлементыПоИмени("dt"); Для каждого Стр из Строки Цикл Тип = стр.ТекстовоеСодержимое; Значение = стр.СледующийСоседний.СледующийСоседний.ТекстовоеСодержимое; Сообщить(""+Тип+": "+Значение+""); КонецЦикла; ЧтениеHTML.Закрыть(); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; КонецПроцедуры В результате если передать ссылку: http://www.oldi.ru/catalog/element/0150727/index.php Отладчик показывает "ЭлементыTABLE.Количество() = 1" все работает а если http://www.oldi.ru/catalog/element/0108625/index.php ничего не работает в частности не находит ДокументDOM.ПолучитьЭлементыПоИмени("dl") Отладчик показывает "ЭлементыTABLE.Количество() = 0" Помогите люди добрые... Подскажите где искать... |
|||
1
vde69
09.07.11
✎
18:33
|
уж не знаю зачем ты ДОМ используешь?
если парсить файл как текст - то регулярными выражениями если как обьект - то через docuvent. |
|||
2
prorokk
09.07.11
✎
18:41
|
(1) Есть пример с регулярными выражениями?
|
|||
3
prorokk
09.07.11
✎
18:43
|
У разных товаров разное описание а в моем примере количество "Строк-характеристик" не ограниченно
Значит в цикле получит все характеристики... |
|||
4
prorokk
09.07.11
✎
19:40
|
из 40 товаров получил описания 10 остальных отказывается(((
|
|||
5
prorokk
09.07.11
✎
20:13
|
Нашли систему...
Читает только товары за которые проголосовали.... |
|||
6
kokamoonga
09.07.11
✎
20:23
|
||||
7
Torquader
09.07.11
✎
20:23
|
Если вам что-то нужно от OLDI, то проще написать им в поддержку, так как если вы планируете у них что-то закупать в приличных объёмах, то вам и данные дадут и с наличием товара подскажут.
Потому как на написание парсера будет потрачено много времени, а потом выяснится, что OLDI поменяли дизайн сайта. |
|||
8
prorokk
09.07.11
✎
21:09
|
(7) мы с ними уже сотрудничаем... пишу для собственного самообразования... к ним запрос уже подготовил, до не думаю что та регулярно будут про нас помнить... а хочется "постоянно" обновлять информацию у себя...
|
|||
9
prorokk
09.07.11
✎
21:13
|
ды и кажется ошибку уже нашел
грузится описания только тех товаров за которые проголосовали так вот за те которые не голосовали в "исходном коде" есть ссылка на Css которого "нет" как мне кажется искал div-ы так вот там где нет голосов он и дивов находит 4 а где читается от 80 и более Думаю что DOM просто отменят загрузку из-за битой ссылки...( |
|||
10
prorokk
09.07.11
✎
21:26
|
(6) А как передать код страницы HTML в RegExp?
|
|||
11
Живой Ископаемый
09.07.11
✎
21:28
|
как строку
|
|||
12
kokamoonga
09.07.11
✎
21:30
|
(10) эмм... может HTTPСоединение поможет?
|
|||
13
Torquader
09.07.11
✎
21:34
|
У них, вроде бы, ajax применяется для страниц - можно попробовать сделать Ajax-запрос, чтобы было проще.
Кроме того, непонятно, зачем "строить" структуру документа, а не работать с данными как с текстом, в котором мы что-то ищем. |
|||
14
prorokk
09.07.11
✎
21:36
|
Как ее получить?)
(12) можно пример как им код получить... |
|||
15
kokamoonga
09.07.11
✎
21:37
|
(13) а чем принципиально отличается работа Ajax-запроса от работы штатного HTTPСоединение? ну кроме используемого языка?
|
|||
16
prorokk
09.07.11
✎
21:38
|
||||
17
kokamoonga
09.07.11
✎
21:38
|
(14) хм... HTTPСоединение.Получить("http://www.oldi.ru/catalog/element/0150727/index.php ") не пойдет?
|
|||
18
kokamoonga
09.07.11
✎
21:40
|
(16) если лень разбираться с HTTPСоединение - создай невидимое ПолеHTMLДокумента, выполняй ему Перейти() и получай текст
|
|||
19
Torquader
09.07.11
✎
21:42
|
Вообще-то, в случае OLDI мы имеем список данных в теге <dl> в странице с товаром он больше нигде не встречается.
Соответственно, мы выбираем из текста то, что в теге <dl> и названия у нас будут в <dt> а значения в </dt> По-мойму, задача для первокурсника. |
|||
20
prorokk
09.07.11
✎
21:45
|
(19) это я и есть) про теги dl знаю вот DOM в принципе все что нужно получает... но к сожалению только у товаров с рейтингом...
|
|||
21
prorokk
09.07.11
✎
21:48
|
(17)Как то так?
HTTP = Новый HTTPСоединение("www.oldi.ru"); HTTP.Получить("http://www.oldi.ru/catalog/element/0150727/index.php"); ошибочка выходить( по причине: Файл не обнаружен 'http://www.oldi.ru/catalog/element/0150727/index.php' по причине: Ошибка работы с Интернет: ресурс не найден (404). <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru"> <head> <title>404 HTTP Status: ???? ?? ??????</title> <meta content="404 HTTP Status: ???? ?? ??????" name="title" /> <meta http-equiv="X-UA-Compatible" content="IE=8" /> <meta name="resourse-type" content="document" /> <meta name="document-state" content="dynamic" /> <link rel="icon" href="/i/favicon.ico" type="image/x-icon" /> <link rel="shortcut icon" href="/i/favicon.ico" type="image/x-icon" /> <link rel="stylesheet" href="/bitrix/templates/oldi/css/reset.css" type="text/css" media="screen, projection" /> <!--[if IE]> <link rel="stylesheet" href="/bitrix/templates/oldi/css/ie.css" type="text/css" media="screen, projection" /> <![endif]--> <!--[if lte IE 7]> <link rel="stylesheet" href="/bitrix/templat |
|||
22
Torquader
09.07.11
✎
21:51
|
Тогда используй WinHttp или XmlHttpRequest - получай результат как текст и ищи в нём заветный tag.
|
|||
23
kokamoonga
09.07.11
✎
21:58
|
(21) это конечно костыль некрасивый но он работает
ЭлементыФормы.ПолеHTMLДокумента2.Перейти("http://www.oldi.ru/catalog/element/0150727/index.php"); Сообщить("Текст ХТМЛ "+ЭлементыФормы.ПолеHTMLДокумента2.ПолучитьТекст()); |
|||
24
kokamoonga
09.07.11
✎
22:00
|
(23) + чтобы не напороться недоформированный ХТМЛ документ в поле можно использовать событие ПоляХТМЛ ДокументСформирован()
|
|||
25
prorokk
09.07.11
✎
22:01
|
(23) попробую:) по хромать
(22) про WinHttp есть где почитать? |
|||
26
Torquader
09.07.11
✎
22:02
|
Вот пример на Visual Basic:
Set http=CreateObject("MSXML2.XmlHttp") http.Open "get","http://www.oldi.ru/catalog/element/0150727/index.php",False http.Send If http.readyState<>4 Then MsgBox "Error in request:" & CStr(http.readyState),0,"Error" WScript.Quit() End If MsgBox http.statusText,0,"Ответ сервера" s=http.responseText l=InStr(1,s,"<dl>",vbBinaryCompare) If l=0 Then MsgBox "Tag not found",0,"Error" WScript.Quit() End If e=InStr(l,s,"</dl>",vbBinaryCompare) r=Mid(s,l+4,e-l-4) ' Теперь получаем данные MsgBox Left(r,1024),0,"Вот они" Получает список товара, где уже нужно парсить dt и dd - думаю, что это уже очень просто. |
|||
27
Torquader
09.07.11
✎
22:03
|
(25) Где почитать - спроси google.
Я просто открыл Excel и посмотрел там все доступные функции из библиотеки Microsoft XML. |
|||
28
prorokk
09.07.11
✎
22:05
|
Google устал уже мне отвечать :()
WinHttp=Новый COMОбъект("WinHttp.WinHttpRequest.5.1"); WinHttp.Option(2,"Windows-1251"); WinHttp.Open("GET","http://www.oldi.ru/catalog/element/0150727/index.php",0); |
|||
29
prorokk
09.07.11
✎
22:06
|
(27) Спасибо) буду побывать)
|
|||
30
Torquader
09.07.11
✎
22:07
|
В (26) рабочий пример - покорми его страницами и посмотри - по идее, должен кушать все.
|
|||
31
kokamoonga
09.07.11
✎
22:07
|
(21) интересная шняга... действительно выкидывает с ошибкой. Но! в означенный файл который вторым параметром идет текст страницы полностью сохраняется
|
|||
32
kokamoonga
09.07.11
✎
22:10
|
(31)+ или не полностью...
|
|||
33
kokamoonga
09.07.11
✎
22:15
|
(28) там по ходу полстраницы аяксом собирается уже на клиенте. может поэтому и ошибка. то есть чтобы сформировать страницу полностью проще обойтись костылем предложенным в (23)
|
|||
34
prorokk
09.07.11
✎
22:57
|
Расскажите как этим пользоваться?
RegExp.Pattern = "([^<]*)(<[^>]*>)([^<]*)"; ([^<]*)(<[^>]*>)([^<]*) вот этим шаблоном... |
|||
35
kokamoonga
09.07.11
✎
23:32
|
(34) почитать про синтаксис регулярных выражений не судьба?
И нафига тебе вообще этот шаблон? тебе свои писать надо |
|||
36
prorokk
09.07.11
✎
23:36
|
(34) уже прочитал:)
|
|||
37
kokamoonga
10.07.11
✎
00:41
|
(36) а в чем суть вопроса тогда? как найти в строке тег <dt></dt> и его содержание?
|
|||
38
prorokk
10.07.11
✎
08:37
|
(37)суть оказалась в "()" при указании шаблона в скобках он выводил в строку не только текст но и теги ...убрал и все заработало)
Всем огромное спасибо) |
|||
39
prorokk
10.07.11
✎
08:53
|
Еще один вопрос... Как вы считаете как удобнее хранить полученную информацию в базе?
просто в виде строки или сделать доп. ТЧ и туда записывать? |
|||
40
prorokk
10.07.11
✎
09:21
|
такая проблема в описаниях встречаются дивы
<dd><div><i>Размер: </i>18.5" (47 см) </div><div><i>Разрешение матрицы: </i>1366 х 768</div></dd> Нужно придумать суда доп. фильтр? чтобы прлучить текст без дивов RegExp.Pattern = "<dt>(.*?)</dt>"; |
|||
41
prorokk
10.07.11
✎
10:43
|
Все решил проблему)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |