Имя: Пароль:
1C
Админ
Помогите с парсером 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
(13) Как получить имея
http://www.oldi.ru/catalog/element/0150727/index.php
Строчку с кодом?
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
Все решил проблему)