2012-07-18 46 views
-3

I've seen this question,这是非常好的和信息。但是,它不涉及一个相当常见的情况。假设我需要取消多个网站(甚至是同一个网域中的网页),但该网站的作者并不关心他的代码,并且有一些严重的格式错误的代码“有点作品”。我需要从该网站获取信息。如何在PHP中处理无效的HTML?

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

可能吗?我必须还原为RegExp吗?

+0

是您希望在解析的HTML上使用PHP DOM操作工具的问题,但是HTML格式错误,您难以做到这一点? – 2012-07-18 17:23:01

+0

就我个人而言,我总是想知道浏览器制造商是如何做到这一点,并活着讲述故事的。 – BoltClock 2012-07-18 17:23:17

+0

也许尝试'strip_tags',然后使用正则表达式来找到其余的标签? – Kermit 2012-07-18 17:23:35

回答

4

您需要一个DOM解析器。 Php has one。然后有aresomealternatives(以及更多...只是谷歌他们)。如果需要,甚至可以运行“乱码HTML”trhu HTML Purifier

+0

你不要说!但是这是我们正在讨论的HTML破碎。这不是有效的HTML。 – 2012-07-18 17:24:13

+6

@Truth所以? “Broken”(格式错误,无效,无论什么......)HTML就像可解析的一样...也许DOM树不是作者想要的,但是你完全可以很好地访问所有你需要的节点/属性。 – RobIII 2012-07-18 17:24:38

+0

RobIII是对的。看看'loadHTML'方法http://www.php.net/manual/en/domdocument.loadhtml.php – 2012-07-18 17:29:38

0

我不知道你是如何刮取网站的,但使用RegExp可以让你在废品码中添加许多条件。这可能需要时间,具体取决于脚印的数量和RegExp技能。

您也可以在站点HTML上使用Tidy,但这也会导致IMO发生奇怪的结果。

+0

看看[我的所有时间最喜欢的StackOverflow答案](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454)使用Regexes来“解析”HTML。然后阅读[解析Html The Cthulhu Way](http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html)获取一些细微差别。对我来说,使用正则表达式的最主要原因是因为正则表达式本身[很快就变成了“不可读”](http://ex-parrot.com/~pdw/Mail-RFC822-Address.html) 。 – RobIII 2012-07-18 17:31:15

+0

那么,我从来没有说过你可以用RegExp解析HTML,这是无稽之谈。显然,使用RegExp可以很好地完成拼凑(即提取数据)。 感谢您的阅读! – 2012-07-19 08:08:55

+0

要提取数据(并正确执行*),您必须解析文档并使用DOM,而不是依赖大量字符串。话说回来;是的,的确,你*可以*使用正则表达式。这就是为什么我添加Jeff Atwoods的文章;-) – RobIII 2012-07-19 09:07:47

0

它必须是PHP吗? Python有一个很好的库叫做Beautiful Soup“你没写那个可怕的页面,你只是想从中获取一些数据”)。根据我的经验,我会推荐这么多,我会说如果你有选择,写一个快速的Python脚本来解析你的节点到一个干净的文件,你的PHP可以拿起。

(知道PHP在标题&这并不直接回答你的问题。道歉,如果你没有的选项(或不喜欢)的Python,只是想提出一个很好的选择。)