如何在 PHP 中处理无效的 HTML?

How do you process invalid HTML in PHP?

提问人:Madara's Ghost 提问时间:7/19/2012 最后编辑:bouteillebleuMadara's Ghost 更新时间:12/31/2020 访问量:270

问:

我看过这个问题,非常好,内容丰富。但是,它不处理相当常见的情况。

假设我需要抓取大量网站(甚至同一域中的页面),但该网站的作者对他的代码不够关心,并且有一些“有点工作”的严重畸形代码。我需要从该网站获取信息。

在这种情况下,我该怎么做?理想情况下,不要去 í͞ń̡͢͡s̶̢̛á̢̕͘ń̵͢҉e̶̸̢̛.

可能吗?我必须恢复到正则表达式吗?

PHP HTML 正则表达式 解析

评论

0赞 Mike Brant 7/19/2012
问题是你想在解析的HTML上使用PHP DOM操作工具,但由于HTML格式不正确,你很难做到这一点?
0赞 BoltClock 7/19/2012
就我个人而言,我一直想知道浏览器制造商是如何做到的,并活着讲述这个故事。
0赞 Kermit 7/19/2012
也许尝试然后使用正则表达式来查找剩余的标签?strip_tags

答:

4赞 RobIII 7/19/2012 #1

你需要一个 DOM 解析器。Php 有一个。然后有一些 替代方案(还有更多......只需谷歌搜索他们)。如果需要,您甚至可以运行“乱码 HTML”trhu HTML Purifier

评论

0赞 Madara's Ghost 7/19/2012
是吗!但我们正在谈论的是破碎的 HTML。这不是有效的 HTML。
6赞 RobIII 7/19/2012
@Truth 所以呢?“破损”(畸形、无效等......HTML 同样可解析...也许 DOM 树并不像作者所希望的那样,但您可以完全访问所需的所有必需节点/属性。
0赞 Dio F 7/19/2012
RobIII是对的。看看方法 php.net/manual/en/domdocument.loadhtml.phploadHTML
0赞 Baptiste Placé 7/19/2012 #2

我不知道您是如何抓取网站的,但是使用RegExp将允许您在抓取代码中添加许多条件。这可能需要一些时间,具体取决于封装的数量和您的正则表达式技能。

您也可以在网站上使用 Tidy,但这会导致奇怪的结果以及 IMO。

评论

0赞 RobIII 7/19/2012
看看我一直以来最喜欢的 StackOverflow 关于使用正则表达式“解析”HTML 的答案。然后阅读 解析 Html 克苏鲁之道,了解一些细微差别。对我来说,使用正则表达式的最大原因是正则表达式本身很快就会变得“不可读”。
0赞 Baptiste Placé 7/19/2012
好吧,我从来没有说过你可以用正则表达式解析 HTML,这是无稽之谈。显然,使用 RegExp 可以很好地完成抓取(即提取数据)。感谢您的阅读!
0赞 RobIII 7/19/2012
要提取数据(并正确地提取数据),您必须解析文档并使用 DOM,而不是依赖一大堆字符串。话虽如此;是的,确实,您可以使用正则表达式。这就是为什么我添加了 Jeff Atwoods 的文章 ;-)
0赞 Baptiste Placé 7/20/2012
也许有一天我会进入 DOM 解析,确实它既有用又简单,而且您不必弄乱字符串(直到您必须解析文本节点)。但这并不像我每天早上都在解析,而且我从来没有失败过使用 RegExp 提取数据。更重要的是,我真的很喜欢用RegExp训练自己,这就像一把瑞士军刀,可以完成许多任务。
0赞 anotherdave 7/19/2012 #3

它必须是PHP吗?Python 有一个很棒的库,叫做 Beautiful Soup“你没有写那个糟糕的页面。你只是想从中获取一些数据“)。根据我的经验,我非常推荐它,以至于我会说,如果你有选择的话,写一个快速的 Python 脚本,将你的节点解析成一个干净的文件,你的 PHP 可以拾取它。

(知道PHP在标题中,这并不能直接回答你的问题。如果您没有(或不喜欢)Python 的选择,我们深表歉意,只是想提出一个不错的选择。