繁体   English   中英

解析HTML文本时正则表达式与XPath

[英]Regular Expressions vs XPath when parsing HTML text

我想解析HTML文本并找到特殊部分。 例如, table的第1 row和第2 column的第3个div中的文本。 我有两个解析选项:正则表达式和XPath。 每个人的优点和缺点是什么?

谢谢

这在某种程度上取决于你是否拥有一个完整的HTML文件,其中包含未知但格式良好的内容,而不仅仅是一段完全已知内容的片段或HTML,这些内容可能是也可能是格式不正确的。

你知道,编辑和解析之间存在差异。

编辑自己编写的HTML文件是一回事,或者正在面对其他人,并发出编辑器命令

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

从200-300行中删除中断。

吸掉URL碰巧出现在URL另一端的任何HTML然后尝试去理解它,看不见它是另一回事。

首先要求使用正则表达式解决方案 - 实际上是上面显示的解决方案。 为了完成上面显示的简单编辑只是为了完成上面所示的简单编辑,要编写一些大量过度工程的庞然大物进行秋季解析来设置整个解析树是完全错误的。 这也是它自己的惩罚。

另一方面,使用模式来解析(而不是lex out)整个HTML文档,它可以包含你不打算做的各种各样的糟糕事情,只是为了利用别人的努力来重新创建轮子你自己,而且很糟糕。

然而,还有一些人没有人愿意提及,那就是大多数人都不能胜任正则表达式。 他们并不真正理解他们。 他们不知道如何测试或制作它们。 他们不知道如何使它们可读和可维护。

问题的真相是,绝大多数正则表达式用户甚至无法管理使用正则表达式匹配任意HTML标记这样简单和基本的事情,即使事情变得像备用编码和CDATA部分以及重新定义的权限和<script>内容所有古老而且从未见过的形式都可以安全地免除。

这不是因为它很难做到; 实际上并非如此。 只是尝试这样做的人们既不理解正则表达式也不理解HTML, 并且他们不知道他们不知道,所以他们比他们意识到的更快地让自己超越他们的头脑。 然后他们手上有一场彻底的灾难。

此外,它已经完成,并且正确。 不妨从别人的错误中学习改变,是吗? 拥有一些罐装正则表达式可能有助于您经常操作。 这对编辑特别有用。

但是对于完整的解析,你真的不应该尝试在你的模式中嵌入一个完整的HTML语法。 老实说,你真的不应该。 说到某人实际上可以并且已经做到了这一点,我不同于99.9999%的响应者,在这方面,当我提出反对意见时,这个领域的实际经验的可信度。 当然,我可以做到,但我几乎从不想这样做,我当然不希望你在家里无人监督地试试。 对于可能造成的任何损害,我不承担任何责任。 :)

当然,这可能听起来像“像我说的那样,而不是像我一样”,但如果你的正则表达精通程度达到允许你思考这种事情的水平,你就不会问这个问题。 正如我所提到的,几乎没有人使用正则表达式实际上可以匹配任意HTML标记,就像那样简单。 鉴于你在编写递归下降语法之前需要那种构建块,并且鉴于旁边没有人可以管理那个简单的构建块,那么......

鉴于这种悲惨的状态,最好只使用正则表达式进行简单的编辑工作,并将其用于更真实的正则表达式向导的完整解决方案,因为它们是微妙且快速的愤怒。 当然是正则表达式的意义,而不是(仅仅)向导。

但是可以肯定的是,保留一些罐装正则表达式来进行简单的编辑而不是完全解析。 这样,每次从第一原则开始,你都不会被迫重新修改它们。 我确实保留了其中的一些,但后来我还保留了简单的框架,允许我编辑HTML的特定结构元素,如纯文本或标记内容或链接引用等,并且这些都使用完整的解析器,然后让我完全放心地手术瞄准我想要的部分,我没有忘记一些东西。

更多的是作为可能的东西的证明,你可以看到更多,嗯,“英雄”模式匹配的一些答案,包括递归, 在这里这里这里这里这里这里

记者了解到,其中一些为人们展示为什么他们应该使用正则表达式的明确目的实际上写的,因为他们中的一些确实很复杂,很多moreso比你能指望nonwizards。 这种困难可能会把你赶走,这很好,因为它有点意思。

但是,不要让它阻止你在HTML文件上使用vi ,也不要让你害怕使用它的搜索或替换命令。 不要让完美成为善的敌人。 有时候足够好就是你需要的东西,因为完美需要的投入比以往任何时候都要多。

了解哪种方法可以让您获得最大的收益,这需要花费一些时间来学习,没有人可以告诉您适合您的答案。 他们不了解您的数据集,您的要求,您的技能组合,您的优先事项。 因此,任何明确的答案都是自动错误的。 你必须自己评估这些东西。

我认为XPath是遍历类XML文档的主要选择。 使用RegExp,您可以自行处理不同形式的标签(多个空格,双引号,单引号,无引号,一行,多行,内部数据,无内部数据等) )。 使用XPath,这对您来说都是透明的,它具有许多功能(例如按索引访问节点,按属性值选择,选择simbling以及其他许多功能)。

请参阅http://www.w3schools.com/xpath/,了解它的强大功能。

编辑:另请参阅HTML解析如果不使用正则表达式如何工作?

如果Web开发人员进行任何微小更改,XPath不太可能中断。 那是我的选择。

下面是规范的Stackoverflow解释为什么你不应该用正则表达式解析HTML:

除了XHTML自包含标记之外,RegEx匹配开放标记

通常,您无法使用正则表达式解析HTML,因为不使用正则表达式来解析HTML。 只需使用XPath。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM