当HTML格式因大小写而异时,如何使用RegEx从HTML标签检索信息?

问题描述

因此,我从https://www.merriam-webster.com/thesaurus抓取了各种单词的各个页面,然后使用RegEx解析出每个单词的多个上下文定义。我遇到了一个问题,即不同的单词对页面的格式设置方式有所不同,因此我很难获得单个正则表达式来涵盖所有可能的情况。这是两个例子。

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

两个示例都使用基本相同的RegEx,但是我必须交换*并交换两个捕获组的Greedy / Lazy顺序。两个不同的示例正在使用来自两个不同单词的数据。您会注意到,如果两个单词都使用相同的RegEx,则在一种情况下,RegEx将匹配HTML的很大一部分,而不是一部分。

这两个示例与上面的两个示例使用相同的两个不同的测试字符串,但是使用的是相同的正则表达式,您将看到它的作用力超出了必要范围:

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

我不确定如何进一步完善正则表达式以在所有情况下仅提取定义。网站可以使用其他几种格式,但出于问题和示例的考虑,我仅使用两种不同的格式。以后,无论解决方案如何,我都可以将其转换为其他格式。

非常感谢任何指导。

解决方法

我修改了您的first regular expression,现在可以正常使用了:

  1. advertising
  2. About

备注

# 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+<
,

我很难获得一个正则表达式来涵盖所有可能的情况。

那是因为编写单个正则表达式来涵盖所有可能的情况是不可行的。

要可靠地解析HTML,您需要使用HTML解析器。您尚未说出使用的是哪种语言,但是http://htmlparsing.com/可以为您提供一些起点。