我想解析HTML文本并找到特殊部分。例如,div
的第1 row
和第column
的第3 table
条中的文字。我有两个解析选项:正则表达式和XPath。每个人的优点和缺点是什么?
感谢
答案 0 :(得分:8)
这在某种程度上取决于您是否拥有一个完整的HTML文件,其中包含未知但格式良好的内容,而不仅仅是一段完全已知内容的片段或HTML,这可能是也可能是格式不正确。
您可以看到编辑和解析之间存在差异。
编辑自己编写的HTML文件是一回事,或者正面对面,并发出编辑器命令
:100,200s!<br */>!!g
从第200-300行删除中断。
在URL的另一端吸取任何HTML,然后试着弄清楚它,看不见,这是另一回事。
首先要求使用正则表达式解决方案 - 实际上是上面显示的解决方案。为了完成上面显示的简单编辑只是为了完成上面所示的简单编辑,要编写一些大量过度工程的庞然大物进行秋季解析来设置整个解析树是完全错误的。这也是它自己的惩罚。
另一方面,使用模式来解析(而不是lex out)整个HTML文档,它可以包含你不打算做的各种糟糕的事情,只是为了利用别人的辛勤工作来重新创建你自己的车轮,并严重的。
然而,还有其他人没人喜欢提及,那就是大多数人都不能胜任正则表达式。他们并不真正理解他们。他们不知道如何测试或制作它们。他们不知道如何使它们可读和可维护。
事情的真相是绝大多数正则表达式用户甚至无法管理使用正则表达式匹配任意HTML标记这样简单和基本的东西,即使事情变得像备用编码和CDATA部分以及重新定义的权限和{ {1}}内容和古老的从未见过的表格都可以安全地免除。
这不是因为它很难做到;实际上并非如此。只是尝试这样做的人们既不理解正则表达式也不理解HTML,和他们不知道知道他们不知道,所以他们让自己陷入困境比他们意识到的更快。然后他们手上就完全发生了灾难。
此外,它已经完成,并且正确完成。不妨从别人的错误中学习改变,是吗?拥有一些罐装正则表达式可能有助于您经常操作。这对编辑特别有用。
但是对于完整的解析,你真的不应该尝试在你的模式中嵌入一个完整的HTML语法。老实说,你真的不应该。说到某人实际上可以并且已经完成了这项工作,我不同于99.9999%的响应者,在这方面,当我提出反对意见时,这个领域的实际经验的可信度。当然,我可以做到,但我几乎从不想这样做,我当然不希望你在家里无人监督地试试。对于可能造成的任何损害,我不承担任何责任。 :)
当然,这可能听起来像“像我说的那样,而不是像我一样”,但如果你的正则表达精通水平达到允许你思考这种事情的水平,你就不会问这个问题。正如我所提到的,几乎没有人使用正则表达式实际上可以匹配任意HTML标记,就像那样简单。鉴于你在编写递归下降语法之前需要那种构建块,并且鉴于旁边没有人能够管理那个简单的构建块,那么......
鉴于这种悲惨的状况,最好只使用正则表达式进行简单的编辑工作,并将其用于更真实的正则表达式向导的完整解决方案,因为它们是微妙而且快速的愤怒。当然是正则表达式的意义,而不是(仅仅)向导。
但是可以肯定的是,保留一些罐装正则表达式来进行简单的编辑而不是完全解析。这样,每次从第一原则开始,你都不会被迫重新修改它们。我确实保留了其中的一些,但后来我还保留了简单的框架,允许我编辑HTML的特定结构元素,如纯文本或标记内容或链接引用等,并且这些都使用完整的解析器,然后让我完全放心地手术瞄准我想要的部分,我没有忘记一些东西。
更多地证明了什么是可行的,你可以看到更多,嗯,“英雄”模式匹配,包括递归, here, here, here, here, here,和 here
了解其中一些内容实际上是出于明确目的而向人们展示为什么他们不使用正则表达式,因为其中一些非常复杂,远远超出了非巫师的期望。这种困难可能会把你赶走,这很好,因为它有点意思。
但是,不要让它阻止您在HTML文件上使用<script>
,也不会让您不再使用其搜索或替换命令。不要让完美成为善的敌人。有时候足够好就是你需要的东西,因为完美需要的投入比以往任何时候都要多。
了解几种可能的方法中的哪种方法可以让您获得最大的收益,这需要花费一些时间来学习,没有人可以告诉您适合您的答案。他们不了解您的数据集,您的要求,您的技能组合,您的优先事项。因此,任何明确的答案都是自动错误的。你必须自己评估这些事情。
答案 1 :(得分:4)
我认为XPath是遍历类XML文档的主要选项。使用RegExp,您可以自行处理不同形式的标签(多个空格,双引号,单引号,无引号,一行,多行,内部数据,无内部数据等) )。使用XPath,这对您来说都是透明的,并且它具有许多功能(例如通过索引访问节点,按属性值选择,选择simbling以及许多其他功能)。
了解http://www.w3schools.com/xpath/的强大功能。
答案 2 :(得分:3)
如果Web开发人员进行任何微小更改,XPath不太可能中断。那是我的选择。
答案 3 :(得分:2)
以下是规范的Stackoverflow解释为什么你不应该用正则表达式解析HTML:
RegEx match open tags except XHTML self-contained tags
通常,您无法使用正则表达式解析HTML,因为不使用正则表达式来解析HTML。只需使用XPath。