Регулярные выражения против XPath при разборе текста HTML - PullRequest
4 голосов
/ 26 августа 2011

Я хочу разобрать текст HTML и найти специальные части. Например, текст 3-го div из 1-го row и 2-го column из table. У меня есть 2 варианта для разбора: регулярные выражения и XPath. Каковы преимущества и недостатки каждого из них?

спасибо

Ответы [ 4 ]

8 голосов
/ 26 августа 2011

Это в некоторой степени зависит от того, есть ли у вас полный HTML-файл с неизвестным, но правильно сформированным контентом, или от простого фрагмента кода или пространства HTML с полностью известным контентом, который может быть или не быть правильно сформированным.

Существует разница между редактированием и анализом, видите ли.

Одно дело - редактировать свой собственный HTML-файл, который вы написали сами или иначе смотрите прямо в лицо, и вы запускаете команду редактора

:100,200s!<br */>!!g

Удаление разрывов из строк 200–300.

Это совсем другое дело - подсосать любой HTML-код на другом конце URL-адреса, а затем попытаться найти смысл.вне его, зрение невидимое.

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

С другой стороны, использование шаблонов для анализа (в отличие от lex out) всего HTML-документа, который может содержать все виды дурацких вещей, которые вы не планируете, просто выкрикиваетдля того, чтобы использовать чужую тяжелую работу, например, воссоздать колесо для себя, и это очень плохо.

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

Правда в том, что подавляющее большинство пользователей регулярных выражений не могут даже управлять такой простой и простой вещью, как сопоставление произвольного тега HTML с помощью регулярного выражения, даже когда такие вещи, как альтернативные кодировки и разделы CDATA, переопределяютсяправа и <script> содержание и архаичные никогда не виденные формы - все благополучно обойдено.

Это не потому, что это трудно сделать;на самом деле это не так.Просто люди, которые пытаются это сделать, не особенно хорошо понимают ни регулярные выражения, ни HTML, и они не знают они не знают, и поэтому они ставят себя в тупик над своимиголовы быстрее, чем они понимают.И тогда у них на руках полная катастрофа.

Плюс, это было сделано раньше и правильно.Можно ли учиться на чужих ошибках для разнообразия, а?Вероятно, было бы полезно иметь в своем распоряжении несколько регулярных выражений для часто используемых манипуляций.Это особенно полезно для редактирования.

Но для полного разбора вам действительно не следует пытаться встраивать полную грамматику HTML в ваш шаблон.Честно, ты действительно не должен.Говоря, как кто-то на самом деле может и сделал это, я не похож на 99,9999% респондентов, которые доверяют этому, когда я советую против этого.Конечно, я могу сделать это, но я почти никогда не хочу, и я, конечно, не хочу, чтобы вы попробовали это дома без присмотра.Я не могу нести ответственность за любой ущерб, который может последовать.:)

Конечно, это может звучать как «Делай, как я говорю, а не как я», но если бы твой уровень владения регулярными выражениями был на уровне, который позволял тебе созерцать такую ​​вещь, ты бы не сталзадаю этот вопрос.Как я уже упоминал, почти никто из тех, кто использует регулярные выражения, на самом деле не может сопоставить произвольный HTML-тег, такой простой, как он есть.Учитывая, что вам нужен такой строительный блок перед написанием грамматики рекурсивного спуска, и учитывая, что практически никто не может даже управлять этим простым строительным блоком, ну ...

Учитывая такое печальное положение вещей, вероятно, лучшеиспользовать регулярные выражения только для простых заданий редактирования и оставить их использование для более полных решений для настоящих мастеров регулярных выражений, поскольку они тонки и быстро раздражают.Имеются в виду, конечно, регулярные выражения, а не (только) волшебники.

Но, конечно, держите некоторые консервативные регулярные выражения под рукой дляпростое редактирование, а не полный анализ. Таким образом, вы не будете вынуждены каждый раз пересматривать их из первых принципов. Я держу некоторые из них рядом, но я также сохраняю простые рамки, которые позволяют мне редактировать определенный структурный элемент HTML, такой как простой текст или содержимое тегов или ссылки, и т. Д., И все они используют полный синтаксический анализатор, позволяя мне тогда хирургически нацеливаться только на те части, которые я хочу, с полной уверенностью, я ничего не забыл.

Больше в качестве свидетельства того, что возможно, чем того, что рекомендуется, вы можете увидеть некоторые ответы с большим количеством "героического" сопоставления с образцом, включая рекурсию, здесь , здесь , здесь , здесь , здесь и здесь .

Поймите, что некоторые из них на самом деле были написаны с явной целью показать людям, почему они должны , а не использовать регулярные выражения, потому что некоторые из них действительно довольно сложные, гораздо больше, чем вы можете ожидать от незнакомцев. Эта трудность может прогнать вас, и это нормально, потому что это было как бы предназначено.

Но не позволяйте этому помешать вам использовать vi в ваших HTML-файлах, и при этом это не должно вас пугать при использовании команд поиска или замены. Не позволяйте совершенному быть врагом хорошего. Иногда достаточно хорошего - это именно то, что вам нужно, потому что для идеального потребовалось бы больше инвестиций, чем оно могло бы когда-либо стоить.

Понимание того, какой из нескольких возможных подходов принесет вам максимальную отдачу от ваших денег, - это то, что требует времени для изучения, и никто не может сказать вам ответ, который работает для вас. Они не знают ваш набор данных, ваши требования, ваши навыки, ваши приоритеты. Поэтому любой категорический ответ автоматически неверен. Вы должны сами оценить эти вещи.

4 голосов
/ 26 августа 2011

Я думаю, что XPath является основной опцией для обхода XML-подобных документов. С RegExp вам решать различные формы написания тега (с несколькими пробелами, двойными кавычками, одинарными кавычками, без кавычек, в одной строке, в нескольких строках, с внутренними данными, без внутренних данных и т. Д. ). С XPath это все прозрачно для вас, и у него много функций (например, доступ к узлу по индексу, выбор по значениям атрибута, выбор символов и многое другое).

Посмотрите, насколько мощным это может быть http://www.w3schools.com/xpath/.

РЕДАКТИРОВАТЬ: См. Также Как работает анализ HTML, если они не используют regexp?

3 голосов
/ 26 августа 2011

XPath с меньшей вероятностью сломается, если веб-разработчик внесет какие-либо незначительные изменения. Это был бы мой выбор.

2 голосов
/ 26 августа 2011

Вот каноническое объяснение Stackoverflow, почему вы не должны анализировать HTML с регулярным выражением:

RegEx соответствует открытым тегам, кроме автономных тегов XHTML

В общем,Вы не можете анализировать HTML с помощью регулярного выражения, потому что регулярное выражение не создано для анализа HTML.Просто используйте XPath.

...