1

我正在解析的页面上有许多 Web 链接,我想捕获所有h3链接,但其中包含特定子元素的链接除外。

示例页面:

<h3 class="r">
    <a href="http://Capture This"></a>
</h3>
   <some tags here>
   <more tags  here>
   <a bit more tags here>
   </div>
</div>
<h3 class="r">
   <a href="http://Capture This"></a>
</h3>
<some tags here>
  <class=ml>
  <more tags here>
  <class=tcl>
  <a bit more tags here>
  </div>
</div>
<h3 class="r">
  <a href="http://Dont capture this"></a>
</h3>
  <some tags here>
  <class=ml>
  <more tags here>
  <a bit more tags here>
  </div>
</div>

捕获 h3 链接:

  • 其中不包含class=ml子元素
  • 或者包含 class ml 和class=tcl元素

此正则表达式匹配所有h3链接:

h3 class=["']?[^"']+["']?><a href=["']?(https?://[^"']+)["']?

此正则表达式匹配其子元素中没有class=ml的所有h3链接(每个h3元素用 doulbe /div 标签分隔):

h3 class=["']?r["']?><a href=["']?(https?://[^"']+)["']?(?=((?!class=ml).)*(</div>){2,})

最后,我正在寻找的正则表达式捕获所有h3链接,这些链接不包含class=ml,或者在其子元素中同时包含class=mlclass=tcl (按此顺序)

h3 class=["']?[^"']+["']?><a href=["']?(https?://[^"']+)["']?(?=((?!class=ml)(?!(</div>){2,}).)*(class=ml((?!class=tcl>).)*class=tcl>|(</div>){2,}))

我附带的正则表达式可以工作,但由于回溯,效率非常低。例如,标准页面匹配的 100 次迭代需要 50 秒才能完成。有没有办法改进这个正则表达式,所以它不会回溯那么多?

我相信我开始了解 HTML 解析Cthulhu 的方式实际上是什么,但希望它不会打扰任何人的睡眠。

PS 我在.NET 正则表达式引擎上,如果这会影响我的选择。

4

0 回答 0