Как вы используете регулярное выражение для извлечения информации из HTML-тегов, когда формат HTML отличается от случая к случаю?

#regex #html-parsing

#регулярное выражение #html-синтаксический анализ

Вопрос:

Итак, я беру различные страницы из https://www.merriam-webster.com/thesaurus для разных слов, а затем используете RegEx для анализа нескольких контекстуальных определений каждого слова. Я столкнулся с проблемой, заключающейся в том, что разные слова по-разному форматируют страницу, поэтому у меня возникли проблемы с получением единого регулярного выражения для охвата всех возможных случаев. Вот два примера.

https://regex101.com/r/mV4yH4/15 и https://regex101.com/r/mV4yH4/16

В обоих примерах используется в основном одно и то же регулярное выражение, но я должен поменять местами * и Жадный / ленивый порядок для двух групп захвата. В двух разных примерах используются данные из двух разных слов. Вы заметите, что если вы используете одно и то же регулярное выражение для обоих слов, в одном случае регулярное выражение будет соответствовать огромному фрагменту HTML в отличие от одной части.

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

https://regex101.com/r/mV4yH4/17 и https://regex101.com/r/mV4yH4/16

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

Любые рекомендации были бы с благодарностью приняты, огромное спасибо.

Комментарии:

1. попробуйте это регулярное выражение <span class="dt ">s (.*?)s*</span>|<span class="dt ">s (. ?)s*<ul class="vis"><li><span class="t"> похоже, оно работает в обоих приведенных примерах

Ответ №1:

Я изменил ваше первое регулярное выражение, и теперь оно работает :

  1. Реклама
  2. О нас

Примечания

 # uncalled for matching of opening of span.thes-list
# matching only on character in the second part of the regular expression
<span class="dt ">(.*?)</span> <span class="thes-list sim-list">|<span class="dt ">(.?)<ul class="vis"><li><span class="t">
  

Обновленная версия

 # matches only the content of the span (first part)
# added s as to remove whitespace characters
# added quantifier to the second part  ? match as much as possible non greedy
<span class="dt ">s (. ?)s*</span>|<span class="dt ">s (. ?)s*<ul class="vis"><li><span class="t">
  

вторая правка

 # matches only the description
<span class="dt ">s ([^<] ?)s <
  

Комментарии:

1. Это решение включает слово, используемое в предложении. Я этого не хочу. Но если я изменю на тег, который предшествует предложению примера, он все равно извлекает более поздний экземпляр тега, заставляя его возвращать целые ненужные части. Редактировать: Я думаю, я могу просто использовать это, а затем обрезать предложение другим регулярным выражением, поскольку стог сена был бы значительно меньше с меньшим количеством ассоциаций. Большое спасибо! Я попал!

Ответ №2:

У меня возникли проблемы с получением единого регулярного выражения для покрытия всех возможных случаев.

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

Для надежного анализа HTML вам необходимо использовать анализатор HTML. Вы не сказали, какой язык вы используете, но http://htmlparsing.com / может дать вам несколько отправных точек.