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;парсинг

См. также

API-интеграция 1С с маркетплейсами ОЗОН, WildBerries, Я.Маркет, СберМегаМаркет, Стройландия, Леруа Мерлен, Hoff, AliExpress для УТ11, КА2, ERP2, УНФ, БП3, Розница, УТ10, УПП1.3

Сайты и интернет-магазины Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Беларусь Россия Управленческий учет Платные (руб)

Модуль для интеграции с маркетплейсами ОЗОН, WildBerries, Я.Маркет, СберМегаМаркет, Стройландия, Леруа Мерлен, Hoff, AliExpress. При помощи расширения поддерживаются следующие методы: обмен остатками товаров, обмен ценами, обработка заказов, печать стикеров, загрузка отчетов комиссионеров по API (в том числе Я.Маркет). Подходит для конфигураций Беларуси. Поддержка искусственного интелекта GigaChat

59990 руб.

05.09.2023    7135    87    74    

68

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

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

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

36000 руб.

03.08.2020    15746    10    17    

11

Оплата покупок "Долями" в 1С:Розница 2.3 (для работы с сервисом dolyame.ru)

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

Готовое интеграционное решение для оплаты покупок Долями в 1C:Розница 2.3. Реализовано в виде расширения. Интеграция сервиса dolyame.ru для приема платежей в рассрочку.

18000 руб.

19.12.2023    1180    6    1    

6

SALE! 15%

Обмен данными с сайтом. БП 3.0

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

Обмен данными с сайтом на платформе 1С:Битрикс (и подобными) для 1С: Бухгалтерия предприятия 3.0.

12000 10200 руб.

18.03.2019    31276    109    100    

62

Интеграция 1С — Битрикс24. Обмен задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (8.3.18.1289). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    17548    6    15    

13

SALE! 33%

«Мониторинг цен» – сервис для отслеживания цен конкурентов на ведущих маркетплейсах России

Маркетплейсы Сайты и интернет-магазины 8.3.14 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Сервис помогает отслеживать цены на ведущих маркетплейсах России только для одного региона – Москва и Московская область. Выполняйте анализ и контролируйте цены Ваших конкурентов сразу в системе 1С.

2400 1608 руб.

29.05.2023    6652    25    37    

15

Выгрузка для АВИТО

Сайты и интернет-магазины Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 Россия Платные (руб)

Выгрузка товаров услуг из 1С для сайта "Авито" раздел "Автозагрузка" выполнена в виде обработки. Обработка подходит для конфигураций УТ, УНФ и Розница. Данная обработка позволяет создавать шаблон с объявлениями для "Авито" - "Автозагрузка".

4200 руб.

07.06.2022    15346    42    56    

37
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. BigB 191 21.10.14 10:56 Сейчас в теме
А при чем тут XPath? То что Вы так назвали функцию? При этом?
С таким же успехом можно было бы назвать её "АдронныйКоллайдер" и заголовок у статьи сделать таким "Адронный коллайдер и парсинг сайтов".
У Вас здесь нет использования XPath. Это у Вас обычный закат солнца вручную.
А, ну да, не вручную, а с помощью функции.
2. faust1976 12 21.10.14 11:42 Сейчас в теме
Если я что то не понимаю вы исправьте .
Функцию назвал так, потому что в браузере увидел такое название.
Если слово XPah для Вас является сакральным, примите мои извинения …
3. BigB 191 21.10.14 12:06 Сейчас в теме
(2) из заголовка я понял, что вы парсите сайты использую встроенные средства платформы для работы с XPath, но оказалась, что Вы просто так функцию назвали.
4. faust1976 12 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 161 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 12 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 12 22.10.14 14:06 Сейчас в теме
Конечно же это не XPath ..
Просто когда я искал решение, то ключевыми словами для меня были : XPath,Запрос … т..д
Мне это помогло … хотелось бы что бы люди сталкивающиеся с подобными задачами находили ответ быстрее чем я .
Ну, а заголовок статьи можно считать провокационным маркетингом
Хотя написать движек XPath в 1С была крамольная мысль ;-)
kuzyara; Jorge272; BigB; +3 Ответить
Оставьте свое сообщение