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) Россия Платные (руб)

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

22440 руб.

19.12.2023    6184    41    11    

37

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

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

36000 руб.

03.08.2020    18595    20    22    

18

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

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

24000 руб.

02.11.2024    776    3    0    

4

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

Интеграция 1С и Битрикс 24. Разработка имеет двухстороннюю синхронизацию 1С и Bitrix24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (платформа начиная с 8.3.23): 1С:Управление торговлей, 1С:Управление Нашей фирмой 3, 1С:Комплексная автоматизация 2, Объединенное решение: Модуль 1С:CRM 3 (3.0.21.3) +1С:ERP Управление предприятием 2. При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

7200 руб.

04.05.2021    20757    13    19    

18

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

Программа позволяет одним кликом настроить сбор цен ваших конкурентов или дилеров в интернете. Автоматически собирает данные результата поиска Яндекса (вам не придется вручную добавлять каждый сайт, за которым нужно следить). Обновление цен происходит по заданному вами расписанию автоматически. Можете легко отслеживать позиции вашего сайта в Яндексе по ключевым словам и фразам. Этот инструмент даст вам лучшее понимание того, как ваша SEO-стратегия влияет на видимость вашего сайта в поисковой выдаче, и поможет вам улучшить контент и структуру сайта для повышения его позиций. Функция доступна во всех тарифах.

19950 руб.

23.09.2019    31326    8    12    

31

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

Расширения для возможности ввода в УТ (ERP КА), УНФ, Рознице 2 множественных свойств и выгрузки значений их на сайт Битрикс.

7500 руб.

29.11.2017    67701    784    108    

212
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. BigB 193 21.10.14 10:56 Сейчас в теме
А при чем тут XPath? То что Вы так назвали функцию? При этом?
С таким же успехом можно было бы назвать её "АдронныйКоллайдер" и заголовок у статьи сделать таким "Адронный коллайдер и парсинг сайтов".
У Вас здесь нет использования XPath. Это у Вас обычный закат солнца вручную.
А, ну да, не вручную, а с помощью функции.
2. faust1976 12 21.10.14 11:42 Сейчас в теме
Если я что то не понимаю вы исправьте .
Функцию назвал так, потому что в браузере увидел такое название.
Если слово XPah для Вас является сакральным, примите мои извинения …
3. BigB 193 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 162 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 Ответить
Оставьте свое сообщение