当strip_tags()烧掉干草堆时

时间:2009-12-29 01:15:18

标签: php html regex conflict strip-tags

我有一个每个美国国会议员的网站列表,我正在以编程方式抓取地址。许多网站的底层标记各不相同,但在我开始看到数百个网站没有给出我编写的脚本的预期结果之前,这不是最初的问题。

在花了一些时间来评估潜在原因后,我发现在strip_tags()的结果上调用file_get_contents()多次删除了大部分页面来源!这不仅删除了HTML,还删除了我想要删除的非HTML!

所以我删除了对strip_tags()的调用,替换了一个调用以删除所有非字母数字字符,并让该进程再次运行。它出现了其他结果,但仍然缺乏很多。这次是因为我的正则表达式与所需的模式不匹配。在查看返回的代码后,我意识到我在整个文本中散布了HTML属性的残余,破坏了我的模式。

有解决方法吗?这是HTML格式错误的结果吗?我可以做些什么吗?

2 个答案:

答案 0 :(得分:5)

PHP手册中有一条警告:

  

因为strip_tags()实际上并不存在   验证HTML,部分或破坏   标签可以导致删除更多   文本/数据超出预期。

由于您正在抓取许多不同的网站,并且您无法解释其HTML的有效性,因此这始终是一个问题。不幸的是,正如regexps simply aren't cut out to be document parsers一样,正则表达式也不适合你。

我会使用类似PHP Simple HTML DOM Parser的内容,甚至是内置的DOMDocument->loadHTML()方法。

您可以保留一个小型数据库,记录您想要抓取的每个页面,以及在该页面结构中找到信息的位置。每次你抓取它,你都可以快速检查结构是否已经改变,在这种情况下,你可以使用DOM解析器的新路径位置更新数据库,并在下一次刮擦时获取它。

答案 1 :(得分:0)

格式错误的HTML很可能是原因 您可以尝试通过DOMDocument::loadhtmlfile()加载页面。可以它“修复”错误 另请查看libxml_use_internal_errors(),因为它可以帮助您识别和处理问题。