Я искал вопросы об обнаружении содержимого на странице, и многие ответы рекомендуют использовать DOM
при анализе веб-страниц вместо REGEX
. Почему это так? Улучшает ли это время обработки или что-то в этом роде.
Парсер DOM на самом деле разбирает страницу.
Регулярное выражение ищет текст, не понимая семантическое значение HTML.
Доказано, что HTML не является регулярным языком; поэтому невозможно создать регулярное выражение, которое будет анализировать все экземпляры произвольного элемента-шаблона из документа HTML без соответствия некоторому тексту, который не является экземпляром этого элемента-шаблона.
Возможно, вам удастся разработать регулярное выражение, которое работает для вашего конкретного варианта использования, но предвидеть именно тот HTML-код, с которым вам будет предоставлен (и, следовательно, как он будет разорвать ваше регулярное выражение с ограниченным использованием) чрезвычайно сложно.
Кроме того, регулярное выражение сложнее адаптировать к изменениям содержимого страницы, чем выражение XPath, и XPath (на мой взгляд) легче читать, поскольку это не должно касаться синтаксических коэффициентов и концов, таких как открытия тегов и закрытия.
Таким образом, вместо использования неправильного инструмента для задания (инструмент синтаксического анализа текста для структурированного документа) используйте правильный инструмент для задания (парсер HTML для анализа HTML).
Я не слышу, что «HTML не является обычным языком …». Регулярные выражения (используемые в современных языках) также не являются регулярными.
Простой ответ:
Регулярное выражение не является синтаксическим анализатором , оно описывает шаблон и соответствует этому шаблону, но не имеет представления о структуре документа. Вы не можете разобрать что-либо с одним регулярным выражением. Конечно, регулярные выражения могут быть частью анализатора, я не знаю, но я предполагаю, что почти каждый парсер будет использовать регулярные выражения внутри, чтобы найти определенные поднабора.
Если вы можете создать этот шаблон для материала, который хотите найти внутри HTML, хорошо, используйте его. Но очень часто вы не сможете создать этот шаблон, потому что его практически невозможно охватить все угловые случаи, или зависимости, такие как найти все ссылки, но только если они зеленые, а не розовые.
В большинстве случаев намного проще использовать Parser, который понимает структуру вашего документа, который также принимает много «разбитых» HTML. Это облегчает вам доступ ко всем ссылкам или всем элементам таблицы определенной таблицы или …
На мой взгляд, безопаснее использовать REGEXP на страницах, где у вас нет контроля над контентом: HTML может быть неправильно сформирован, тогда парсер DOM может выйти из строя.
Редактировать:
Ну, рассмотрев то, что я только что прочитал, вы, вероятно, должны использовать regexp, только если вам нужны очень маленькие вещи, например, получение всех ссылок документа, e tc.