Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Однако, если вам захочется поработать с css-классами, то использование XPath доставит вам много головной боли
//h3[contains(concat(' ', @class, ' '), ' r ')]/a
...class=...[^>]*>(?<text>...)<...
.
...(?<attr1>...)?(?<attr2>...)?
либо выполняете несколько matches на каждый атрибут.
<ul>
или чего еще хуже с таблицами, и вы начинаете понимать что что-то пошло не так, но продолжаете использовать регулярки, чтобы достать значения из td вы вначале захватываете таблицу, потом коллекцию tr, и проходите по коллекции td, регулярки вида
...[^>]*>(?<text>...)<...
растут как грибы на каждый элемент/идентификатор/класс/аттрибут.в чем ужас использовать для этого самый эффективный способ?Как раз ровно об этом следующий ответ на странице.
Don't listen to these guys. You actually can parse context-free grammars with regex if you break the task into smaller pieces. You can generate the correct pattern with a script that does each of these in order:
Solve the Halting Problem.
Square a circle (simulate the «ruler and compass» method for this).
Work out the Traveling Salesman Problem in O(log n). It needs to be fast or the generator will hang.
The pattern will be pretty big, so make sure you have an algorithm that losslessly compresses random data.
Almost there — just divide the whole thing by zero. Easy-peasy.
Вкратце это быстрая, относительно удобная библиотека для работы с HTML (если XPath запросы будут несложными). Репозиторий давно не обновляется.
В настоящее время (2020) парсер HtmlAgilityPack вполне живой, правда с 2017 года его разработка ведется на GitHub. Думаю имеет смысл обновить ссылку в статье.
я парсю так на .Net:
загружаю плоский HTML страницы (могут быть разные реализации)
прогоняю через SgmlReader - он выдает валидный ХMLDocument (https://github.com/kekyo/CenterCLR.SgmlReader)
делаю запросы ХPath к ХMLDocument DOM, результаты пишу в предварительно подготовленные таблицы БД
Распарсить HTML в .NET и выжить: анализ и сравнение библиотек