xPath и парсинг сайтов

20.10.14

Интеграция - Сайты и интернет-магазины

Процедура получения части HTML страницы с помощью XPath запроса.

В процессе анализа сайтов с помощью браузера Chrome часто обращал внимание на пункт меню "Copy XPath"

После нескольких попыток разобраться как же это реализовано в 1С, почти забил.

Но нашел пример использования для Экселя http://www.ozgrid.com/forum/showthread.php?t=183596

Приписал для 1С . Результат представляю на Ваш суд 

&НаКлиентеНаСервереБезКонтекста
Функция getXPathElement(sXPath, objElement ) 
	
     // Split the xpath statement
    лМассивХР = СтрЗаменить(sXPath, "/",Символы.ПС);
    лИндексНоды = СтрПолучитьСтроку(лМассивХР,1); //лИндексНоды
	Если Найти(лИндексНоды, "@id") > 0 Тогда
		лИмя = СтрЗаменить(лИндексНоды,"[","");
		лИмя = СтрЗаменить(лИмя,"]","");
		лИмя = СтрЗаменить(лИмя,"=",Символы.ПС);
		лИмя = СтрПолучитьСтроку(лИмя,2);
		лИмя = СтрЗаменить(лИмя,"""","");
		ЛobjElement = objElement.ПолучитьЭлементПоИдентификатору(лИмя); 
		лМассивХР = СокрЛП(СтрЗаменить(лМассивХР,СтрПолучитьСтроку(лМассивХР,1),""));
		лИндексНоды = СтрПолучитьСтроку(лМассивХР,1);
	Иначе 
		ЛobjElement = objElement;
	КонецЕсли;	
	
	If Not Найти(лИндексНоды, "[") > 0 Then
        sNodeName = лИндексНоды;
        lNodeIndex = 1;
    Else
        лИндексНоды = СтрЗаменить(лИндексНоды, "[",Символы.ПС);
		лИндексНоды = СтрЗаменить(лИндексНоды, "]",Символы.ПС);
		sNodeName =  СтрПолучитьСтроку(лИндексНоды,1);
        lNodeIndex = Число(СтрПолучитьСтроку(лИндексНоды,2));
    EndIf;
	sRestOfXPath ="";
	Для Сч =2 По СтрЧислоСтрок(лМассивХР) Цикл
		sRestOfXPath = sRestOfXPath + ?(Сч=2,"","/")+СтрПолучитьСтроку(лМассивХР,Сч);		
	КонецЦикла;
     
    getXPathElement = Неопределено;
	
	лСчЭлементов = 0;
    For lCount = 0 To ЛobjElement.ДочерниеУзлы.Количество() - 1 Цикл
        If ВРег(ЛobjElement.ДочерниеУзлы.Item(lCount).ИмяУзла) = ВРег(sNodeName) Then
			лСчЭлементов = лСчЭлементов + 1;
			If lNodeIndex = лСчЭлементов Then
                If sRestOfXPath = "" Then
                    getXPathElement = objElement.ДочерниеУзлы.Элемент(lCount);
					Прервать;
                Else
                    getXPathElement = getXPathElement(sRestOfXPath, ЛobjElement.ДочерниеУзлы.Элемент(lCount));
					Прервать;
                EndIf;
            EndIf;
        EndIf;
	КонецЦикла;
	Возврат getXPathElement;
КонецФункции

Публикую после тестирования в своей обработке (т.е. прошла боевую проверку).

Пользоваться оказалось очень удобно :

	ЧтениеHTML = Новый ЧтениеHTML;
	ЧтениеHTML.УстановитьСтроку(ОтветСервера);
	ПостроительDOM = Новый ПостроительDOM;
	ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);
	
	// Соберем данные из оглавления каталога 
	СтрокаХР = "[@id="+""""+"ContentWrapper"+""""+"]/div[1]/div[1]/ul";
	лКаталог = getXPathElement(СтрокаХР, ДокументHTML);

ОтветСервера - Это чистый HTML, в моем случае полученный как ответ WinHttp.ResponseText

Вступайте в нашу телеграмм-группу Инфостарт

xPath;парсинг

См. также

Сайты и интернет-магазины 1С v8.3 1С:Розница 2 Розничная и сетевая торговля (FMCG) Россия Платные (руб)

Интеграция сервиса dolyame.ru с 1С:Розница 2.3 для приема платежей в рассрочку. Готовое интеграционное решение для оплаты покупок Долями в 1C:Розница 2.3. Реализовано в виде расширения. Интеграция сервиса dolyame.ru для приема платежей в рассрочку. Поддерживает работу от разных юридических лиц. Работа: в составе РИБ, отдельно от РИБ, тонкий, толстый клиент, web-клиент (через интернет-браузер), поддерживается старый РМК, работа через чек ККМ.

24000 руб.

19.12.2023    10444    59    14    

54

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь 1С v8.3 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM / LOGICSTARS. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM / LOGICSTAR разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    21804    31    24    

25

Сайты и интернет-магазины Программист Пользователь 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Платные (руб)

Данный модуль предоставляет возможность выгружать заказы из 1С: Управление торговлей 11 версии в "MEASOFT" (ранее "Курьерская служба 2008").

9600 руб.

27.04.2022    12498    22    3    

13

Сайты и интернет-магазины 1С v8.3 1С:Розница 3.0 Розничная и сетевая торговля (FMCG) Россия Платные (руб)

Готовое интеграционное решение для оплаты покупок Долями в 1C:Розница 3.0. Реализовано в виде расширения. Интеграция сервиса dolyame.ru для приема платежей в рассрочку. Поддерживает работу от разных юридических лиц. Работа: в составе РИБ, отдельно от РИБ, тонкий, толстый клиент, web-клиент (через интернет-браузер). Интегрировано в Чек ККМ, Рабочее место кассира (РМК)

26400 руб.

02.11.2024    2849    13    2    

11

Файловый обмен (TXT, XML, DBF), FTP Сайты и интернет-магазины 1С v8.3 1С:Управление торговлей 11 Россия Платные (руб)

Загрузка файла YML (формат Yandex Market Language(YML) — собственный стандарт Яндекса, основанный на XML) в УТ11.5 Создание дерева номенклатуры, создание карточек номенклатуры и доп реквизитов, загрузка картинок в карточку. Оптимизировано для выгрузки в Битрикс. Возможна загрузка нескольких Фид - предусмотрено разделение по площадкам

7000 руб.

01.11.2024    1278    1    1    

2

Прайсы Оптовая торговля Ценообразование, анализ цен Сайты и интернет-магазины Пользователь 1С v8.3 1C:Бухгалтерия 1С:Управление торговлей 11 Управленческий учет Платные (руб)

Легкая обработка для мониторинга цен практически любого сайта (парсинга), не требует специальных знаний при настройке.

6960 руб.

17.04.2017    33487    30    28    

43
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. BigB 193 21.10.14 10:56 Сейчас в теме
А при чем тут XPath? То что Вы так назвали функцию? При этом?
С таким же успехом можно было бы назвать её "АдронныйКоллайдер" и заголовок у статьи сделать таким "Адронный коллайдер и парсинг сайтов".
У Вас здесь нет использования XPath. Это у Вас обычный закат солнца вручную.
А, ну да, не вручную, а с помощью функции.
2. faust1976 13 21.10.14 11:42 Сейчас в теме
Если я что то не понимаю вы исправьте .
Функцию назвал так, потому что в браузере увидел такое название.
Если слово XPah для Вас является сакральным, примите мои извинения …
3. BigB 193 21.10.14 12:06 Сейчас в теме
(2) из заголовка я понял, что вы парсите сайты использую встроенные средства платформы для работы с XPath, но оказалась, что Вы просто так функцию назвали.
4. faust1976 13 21.10.14 12:25 Сейчас в теме
Да. Именно так .
Т.к. не смог разобраться как использовать встроенные возможности платформы.
При попытке воспользоваться встроенными возможностями и строкой XPath полученной из браузера результат оказался нулевой
5. AlX0id 22.10.14 10:09 Сейчас в теме
(4) Проблема в том, что XPath - это чуть больше, чем строка пути в хроме ))
https://ru.wikipedia.org/wiki/XPath
6. AlX0id 22.10.14 10:16 Сейчас в теме
И да - в 1С для HTML он не работает. К сожалению.
7. Dmitryiv 165 22.10.14 10:28 Сейчас в теме
(6) AlX0id, Отчего же не работатет. Работатет, если страница сформирована по всем правилам XHTML.
8. AlX0id 22.10.14 11:41 Сейчас в теме
(7) Dmitryiv,
Я к тому, что вот такой кусок кода работать не будет.
ЧтениеHTML = Новый ЧтениеHTML;
ЧтениеHTML.ОткрытьФайл(ИмяВременногоФайла);
ПостроительDOM = Новый ПостроительDOM;
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеHTML);
		
Разыменователь = Новый РазыменовательПространствИменDOM(ДокументDOM);
Выражение = ДокументDOM.СоздатьВыражениеXPath("//a", Разыменователь);

Упадет на последней строке - из-за того, что построитель ДОМ на самом деле создаст объект типа ДокументHTML (что как по мне довольно странно), у которого нет метода СоздатьВыражениеXPath. Или я ошибаюсь и в случае "если страница сформирована по всем правилам XHTML" - будет наблюдаться другое поведение?
9. faust1976 13 22.10.14 12:32 Сейчас в теме
Коллеги, к сожалению, когда нужно распарсить несколько сайтов, некогда разбираться какой сформирован по правилам XHTML, а какой нет. Решение должно быть простым и быстрым.
Вот скопировать строку из браузера и вставить в настройки – это быстро. И это будет работать какое то время
С теоритической точки зрения XPath действительно больше чем просто строка, но как говорил Дэн Сяопин «Не важно, какого цвета кошка, лишь бы она ловила мышей» А мыши не все серые, и не всегда мыши …

На сайте я не нашел работающих примеров которые помогли бы мне использовать строчку из браузера для поиска элементов в загруженной страничке HTML.
Если можете поделиться информацией как можно использовать метод СоздатьВыражениеXPath для поиска части страницы - пожалуйста поделитесь
10. AlX0id 22.10.14 13:57 Сейчас в теме
(9)
Вероятно, подойдет вот это http://msdn.microsoft.com/en-us/library/aa926403.aspx. Но опять же,судя по отзывам из интернета, даже MSXML2.DOMDocument не очень-то хорошо переваривает HTML.

Не обижайтесь, но просто ваш инструмент - это не XPath, а просто перебор дерева DOM в соответствии с некоторым правилом. Говоря об XPath, хотелось бы видеть хотя бы функции contains, >, < и т.п.. Типа "//*[contains(name(),'C')]", например..
11. faust1976 13 22.10.14 14:06 Сейчас в теме
Конечно же это не XPath ..
Просто когда я искал решение, то ключевыми словами для меня были : XPath,Запрос … т..д
Мне это помогло … хотелось бы что бы люди сталкивающиеся с подобными задачами находили ответ быстрее чем я .
Ну, а заголовок статьи можно считать провокационным маркетингом
Хотя написать движек XPath в 1С была крамольная мысль ;-)
kuzyara; Jorge272; BigB; +3 Ответить
Для отправки сообщения требуется регистрация/авторизация