2

我知道用于解析RegEx是公众舆论;但是,对于我想要实现的目标,我看不到使用(在以前的使用中添加了类似的功能,例如in )会有什么害处。 HTMLRegExScripting LanguagesRegEx_StringBetween( )AutoIt3

我也知道这_StringBetween( )不是专门为它编写的,但在过去的 8 年里,HTML我一直在与其他人一起使用它,在内容上没有任何问题。HTML

对于我来说HTML Extraction API,我想介绍以下内容HTML

<div class="video" id="video-91519"><!-- The value of the identifier is dynamic-->
  <a href="about:blank"><img src="silly.jpg"><!-- So is the href and src in a, img -->
</div>

API我试图写的原因是为了使提取video_urlthumbnail非常容易,因此HTML parser似乎遥不可及。我希望能够使用以下内容提取它

<div class="video" id="video-{{unknown}}">{{unknown}}<a href="{{video_url}}"><img src="{{thumbnail}}">{{unknown}}</div>

当然,在上一篇中,HTML你可以更容易地做到这一点,例如

<a href="{{video_url}}"><img src="{{thumbnail}}">

但我试图提供一个完美的例子以避免混淆。

怎么RegEx上场?好吧,我打算用 和 替换和,当然还要{{video_url}}确保在提供的输入(不是)中没有多次出现and 。{{thumbnail}}{{unknown}}(.*?)(.*?).*/s{{video_url}}{{thumbnail}}HTML

那么,我有什么理由不使用RegEx或仍然选择HTML parser包含。RegEx可接受和/或使用的概念证明HTML parser我个人无法看到如何使用HTML parser

4

1 回答 1

0

我认为您提出问题的方式预先假定了解决方案:如果您希望能够指定要匹配的模式,那么您必须使用模式匹配语言,例如正则表达式。但是,如果您将问题框定为允许搜索文档中的内容,那么其他选项可能可用,例如编译为 XPath 表达式的基于路径的输入,或 jQuery 等非常成功地使用的 CSS 选择器。

您在这里构建的并不是真正的HTML 提取 API,而是正则表达式处理 API - 您正在发明一种简化的模式匹配语言,可以编译为正则表达式,并且该正则表达式应用于任何字符串。

这本身并不是一件坏事,但如果该模式匹配 API 的用户尝试使用它来解析更复杂或不可预测的文档,他们将遇到每个人在尝试使用正则表达式匹配 HTML 时遇到的所有问题,加上您的预处理器施加的额外限制。这些限制是简化语言的必然结果:您正在交易正则表达式引擎的一些功能,以使您的模式更加“用户友好”。

回到重新构建问题的想法,这里有一个简化的匹配 API 示例,它可以编译为 CSS 表达式(例如与SimpleHTMLDOM一起使用):

 Find: div (class:video)
 Must-Contain: a, img
 Match: id Against video-{{video_id}}
 Child: a
     Extract: href Into video_url
 Child: img
     Extract: src Into thumbnail

请注意,这种语言与 HTML 相比要抽象得多。这有优点也有缺点。一方面,您问题中的简单匹配模式很容易基于单个示例创建。另一方面,它更容易受到 HTML 变化的影响,这可能是由于网站的变化,或者是页面内的变化,例如向少量视频添加了额外的 CSS 类“精选视频”。基于选择器的示例要求用户了解 API 的更多细节,但如果他们一开始就不懂 HTML 和模式匹配,那么冗长的语法可能比涉及大量神秘标点符号的语法对他们更有帮助。

于 2014-07-26T00:24:42.380 回答