Преимущества XPath для парсинга HTML

07.08.14

Интеграция - WEB-интеграция

Парсинг HTML без регулярных выражений

Скачать файлы

Наименование Файл Версия Размер
ПарсерЯндексМаркет.epf
.epf 1,40Mb
85
.epf 1,40Mb 85 Скачать

Пост уважаемого Elisy о парсере сайтов для 1С:Предприятия заслуживает на мой взгляд большего внимания, в связи с чем решил написать о своем опыте парсинга HTML и о том, зачем для этого использовались компоненты ElisyNetBridge и HtmlAgilityPack.

Зачем это нужно?

XPath позволяет простым способом получить перечисления нужных элементов HTML страницы, например список популярных категорий товаров (вверху заглавной страницы Яндекс.Маркет) можно получить так:

Разделы = HAP.DocumentNode.SelectNodes("//ul[@class='b-flex-gridb-popular-categories']");

мы получим контейнер, хранящий объекты категорий


соответственно код

Подразделы = Разделы.get_Item(0).SelectNodes(".//a[@class='name']"); 
Для i = 0 По Подразделы.Count - 1 Цикл
	Раздел = СокрЛП(Подразделы.get_Item(i).InnerHtml);
	Ссылка = СокрЛП(Подразделы.get_Item(i).Attributes.get_Item(1).value); 
КонецЦикла;

Вернет названия и ссылки на все категории популярных товаров с заглавной страницы. Перейдя по ссылке категории и выполнив код

Для Каждого ЭлементНоды Из СписокНодРаздела Цикл
	HAP.LoadHtml(appIE.Document.documentElement.innerHTML);
	КонтейнерПроизводителей = HAP.DocumentNode.SelectNodes("//a[text()='Популярные']/preceding::div[1]");
	Производители = КонтейнерПроизводителей.get_Item(0).SelectNodes(".//li[@class='pop-vendors__vendor']"); 
	Для e = 0 По Производители.Count - 1 Цикл
		Сообщить("Производитель №" + СокрЛП(e + 1) + " " + СокрЛП(Производители.get_Item(e).InnerHtml)); 
	КонецЦикла; 
КонецЦикла;

Можно получить всех текущих производителей данной категории со ссылками на страницы с перечнем их товаров


Почему не RegEx?

Почему не стоит использовать регулярные выражения для парсинга HTML хорошо написано тут.

Зачем HtmlAgilityPack?

XPath может работать только с валидным XML, каковым HTML страница в большинстве случаев не является, т. к. браузеры не требовательны к валидности XML - достаточно одного <br> и стандартные компоненты для работы с XPath просто не смогут загрузить документ для дальнейшей обработки.

Зачем ElisyNetBridge?

Не уверен, есть ли варианты проще для подключения HtmlAgilityPack в 1С, кроме ElisyNetBridge. Ссылка на бесплатную версию компоненты любезно выложена автором в его статье, компонента также есть в приложенной обработке.

Как тестировать выражения XPath?

В состав HtmlAgilityPack входит HAP Explorer (на скриншоте), загрузив в него HTML исходной страницы можно тестировать различные выражения и смотреть полученные результаты. Правда бывает падает при сложных выражениях :)

Вроде бы все понятно, но…

К статье прикреплена обработка с примером использования ElisyNetBridge и HtmlAgilityPack. Прошу не судить строго за синтаксис XPath - перебор категорий популярных товаров сделан для примера, XPath предлагает широкие возможности для перебора нужных элементов, наверняка есть варианты получше.

ElisyNetBridge HtmlAgilityPack парсинг

См. также

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

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

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме. Без существенных изменений типовой конфигурации. Проверено с брендами: Интеграция 1С и GEELY Интеграция 1С и HAVAL Интеграция 1С и KIA Интеграция 1С и FORD Интеграция 1С и LADA ГАРАНТИЯ 100% ВНЕДРЕНИЯ!

36000 руб.

03.08.2020    15655    9    17    

9

Модуль для обмена "1С:Предприятие 8. УАТ. ПРОФ" с FortMonitor

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    12809    30    8    

10

Интеграция 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    17424    6    15    

13

[Расширение] БОР-Навигатор.Культура

Зарплата Бюджетный учет WEB-интеграция Обмен с ГосИС Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    25686    9    0    

7

Интеграция с сервисом vetmanager

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

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    16256    41    49    

22
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Elisy 948 08.08.14 05:28 Сейчас в теме
Спасибо за статью-продолжение. Полезным, например, для меня было узнать про HAP Explorer. Думаю эта утилита сократит время на разработку XPath. Забавно также описание, почему нельзя использовать RegEx в мире Html со вставками вида <i>he an&#8203;*̶͑̾̾&#8203;̅ͫ͏̙̤g͇̫͛͆̾ͫ̑͆l͖͉̗̩̳̟̍ͫͥͨ</i>
3. monsta 58 20.09.14 00:31 Сейчас в теме
(1) Можно использовать 1С альтернативу HAP Explorer от Yashazz http://infostart.ru/public/280340/ и статья у коллеги хорошая
2. K_A_O 538 12.08.14 11:48 Сейчас в теме
Статья полезная. Вот только название плохое. Думал, разбор на языке 1С, даже открывать не хотел.
4. Гость 19.10.14 17:50
Evaluation limitation

All unregistered versions (evaluation copies) of Elisy .Net Bridge component show a message box when first accessed from 1C:Enterprise.

All unregistered versions (evaluation copies) of Elisy LinqTo1C component support generation of up to 7 tables.
5. Bublik2011 9 19.10.14 19:04 Сейчас в теме
Сегодня только нашел альтернативное чтение Xpath Тоже неплохо читается

	xmlParser= новый COMОбъект("msxml2.domdocument.6.0"); 
	xmlParser.loadXML("<html> <body>    <div>Первый слой      <span>блок текста в первом слое</span>    </div>    <div>Второй слой</div>    <div>Третий слой      <span class='text'>первый блок в третьем слое</span>      <span class='text'>второй блок в третьем слое</span>      <span>третий блок в третьем слое</span>    </div>    <img />  </body></html>"); 
	responseCode = xmlParser.selectSingleNode("html/body/div").text;
	Сообщить(responseCode);

6. monsta 58 19.10.14 19:16 Сейчас в теме
Попробуйте один тег не закрывать и поймете зачем нужен HtmlAgilityPack
7. Bublik2011 9 19.10.14 19:27 Сейчас в теме
(6) Вы правы. Придется в таком случае обработать ошибку , ТипЗнч(responseCode)=Неопределено и дальше обрабатывать сайт,
очень хорошо описаны функции msxml2.domdocument.6.0
http://msdn.microsoft.com/ru-ru/library/System.Xml.XmlNode
8. monsta 58 20.10.14 21:17 Сейчас в теме
Уверяю вас, большинство страниц не содержит валидного html. Соответственно весь сайт будет ТипЗнч(responseCode)=Неопределено.
HtmlAgilityPack преобразует невалидный html в валидный xml. За ссылку спасибо.
9. husky 6 27.10.14 10:22 Сейчас в теме
Установите компоненту C:\Users\...\AppData\Local\Temp\\ElisyNetBridge.exe - не запускается обработка, вроде все установил, но все пишет установить компоненту.. Что делать?
11. Bublik2011 9 02.11.14 23:23 Сейчас в теме
(9) husky, перейдите к этому файлику. Это архив с расширением exe. Распакуете, будет внутри искомое. После установки разочаруетесь.

Вот простоя связка
1) Bitrix ENV (Bitrix Environment for Windows) или посложнее - Denwer

2) Простой редактор PHP (Scite)

3) НЕтриальный и БЕЗограничений firepath-0.9.7-fx1.xpi (простой, понятный, Уверене, применяли FireBug, так вот FirePath 0.9.7 - отлично работает.

Поверили? Есть время попробовать?
Тогда a) ищем архивную версию Firefox firefox-portable-12-0-28432-en-setup.exe
б) firebug-1.9.2.xpi , с которым будет работать
в) и наконец-то firepath-0.9.7-fx1.xpi
г) запускаем firefox-portable под другим пользователем, чтобы настройки мозиллы остались нетронутыми

В прикрепленном файле этот архив с этими файлами есть.

Автору статьи, который утверждает, что Xpath дает преимущества при парсинге - огромное уважение за такой заголовок. Ну не правда-ли, лаконично и на скорую руку можно парсер сделать.

<?php

$xpath = new DOMXPath(conn("http://www.zava.ru/catalog104_1.shtml"));
 foreach($xpath->query(".//*[@class='goods_h1']/a") as $a)
                { 
                    echo $a->getAttribute('href').'';
                }

function conn($Urlf)
{
$ch=curl_init();
$dom = new DOMDocument();
        $DOM->validateOnParse = true;
        @$dom->loadHTML($html);
return $dom;
}



Показать
Прикрепленные файлы:
soft.zip
12. husky 6 03.11.14 19:49 Сейчас в теме
(11) Bublik2011, хочу попробовать, но можно по-подробнее описать пункты 1-3 (ну так чтобы для тупых) и что значит под другим пользователем? и самое главное зачем все это нужно?
15. cool.vlad4 2 03.11.14 21:02 Сейчас в теме
(12) husky, советует firepath (это плагин к firefox для проверки xpath запросов прямо в браузере на странице) . у меня он тоже стоит. замечание по таблицам - firefox достраивает таблицы с тегом tbody(это делается как я понимаю согласно стандарту). так, что при написании xpath запросов лучше не использовать тег tbody. а второе совет - это использовать php в качестве языка парсинга. по мне так второй совет - сомнителен. уж лучше python, не нужен будет никакой ни denwer и иже прочее. на хабре целый фрэймворк был для python-а по парсингу сайтов описан. grab называется. http://grablib.org/ru/ а так этих библиотек по парсингу для python-a как грязи.
19. Bublik2011 9 29.11.14 21:14 Сейчас в теме
(15) cool.vlad4, я Вам доверяю, мне тоже п.1 нравится :) Захотелось перейти на grab . Буду рад узнать о том , что grab эффективнее и доступнее.
18. Bublik2011 9 29.11.14 21:06 Сейчас в теме
(12) husky, очень буду рад очень подробно все описать, если при ближайшей возможности смогу объявить xpath=Новый COMОбъект("V8.DOMXPath") . У меня есть скриншоты и тексты, на написание которых вдохновили посты habrahabr.ru про преимущества xpath.


Соглашусь в Вами, husky, про Elisy .Net Bridge надо в заголовке написать про ограничения. Очень неприятно, знаете, с уважением изучать тексты описаний методов AgilityPack и уже чуть позже понимать, что еще есть риски при использовании - какие-то ограничения и весьма неопределенная сумма за снятие ограничений , приобретение лицензии за подключение dll HtmlAgilityPack.
10. monsta 58 27.10.14 20:15 Сейчас в теме
Попробуйте скачать необходимый компонент по ссылке
13. cool.vlad4 2 03.11.14 20:45 Сейчас в теме
добавлю свои 5 копеек. раньше использовал htmlagilitypack, и даже здесь на сайте советовал его. сейчас все больше использую csquery. как-то с css селекторами мне лично проще. тем более в большинстве случаев селектор тупо копируется из css на сайте прямо в браузере, того элемента, который нас интересует.
PS кстати что htmlagilitypack не покрывает всего множества xpath, что csquery не покрывает всех css селекторов. вот такая беда. но как правило можно просто переписать xpath либо селектор.
к htmlagilitypack также есть расширение fizzler + fizzlerex , которое добавляет css селекторы.

ps еще могу посоветовать restsharp . это библиотека http клиент, который из коробки может много чего. http://restsharp.org/ . я использую связку restsharp+csquery
14. cool.vlad4 2 03.11.14 20:49 Сейчас в теме
еще по-оффтоплю. есть fiddler, про него многие знают. а к нему есть плагин http://www.chadsowald.com/software/fiddler-extension-request-to-code , с помощью которого генерируется код запроса. очень удобно при парсинге, где есть заморочки, типа авторизации или всяких ajax . можно получить код и его проанализировать, подправить и т.п.
16. Поручик 4670 10.11.14 09:25 Сейчас в теме
Совсем без регулярных выражений не обойтись. Сейчас делаю проект, в котором есть разбор HTML. Сам html разбираю с помощью построителя DOM, а некоторые данные приходится выцеплять регулярными выражениями.
17. monsta 58 10.11.14 20:21 Сейчас в теме
Cам HTML парсить регулярками не комильфо. Про некоторые данные вопросов нет.
20. pomestnik 50 23.12.14 13:36 Сейчас в теме
А как конвертировать и сохранить html страницу в валидный xml, который можно будет уже спокойно обработать 1сным DOM'ом
нашел в справке метод, но XmlTextWriter где его взять в 1ске)

HtmlWeb..::..LoadHtmlAsXml Method (String, XmlTextWriter)
Loads an HTML document from an Internet resource and saves it to the specified XmlTextWriter.
public void LoadHtmlAsXml(
string htmlUrl,
XmlTextWriter writer
)


или на вход пустить текст html страницы, а на выходе получить валидный xml .
21. ollega 115 16.11.16 14:19 Сейчас в теме
Не подключается Elisy через ПодключитьВнешнююКомпоненту в вашей обработке.
Попытался через Новый ComОбъект но потом зависает на выполнении команд.
Естественно всё необходимое установил. Из вашей обработки только не устанавливается Elisy, из другого источника установил. NetFramework так же установил и т.д.
Стоит Window7 64x как у вас то работает?
23. ollega 115 16.11.16 17:32 Сейчас в теме
Наперезагружался, поиграл с правами и т.д. Таки заработало частично, но через ComОбъект. Но вот на строке assemblyBytes = net.CallStatic("System.Convert", "FromBase64String", ДвоичныеДанные);

Зависает, не продвигается дальше. Такое ощущение, что работает только на 32х разрядных системах
24. Serginio 938 16.11.16 18:03 Сейчас в теме
25. piton66 2 16.03.18 09:57 Сейчас в теме
Простите что не в тему))...Пытаюсь пропарсить цены через Соединение.Получить(АдресСайта). Адреса сайтов забиты уже в базе и привязаны к номенклатуре. перехожу по ним циклом.
После работаю через построительДОМ.
Но это очень долго!!!! Условно товар в секунду парсится. Дольше всего работает именно Соединение.Получить(АдресСайта).
50 тыс товаров так парсить это анриал.
Может есть ещё какие варианты?
Оставьте свое сообщение