当strip_tags()烧干草堆时
作者:互联网
我有一个我正在以编程方式抓取地址的美国国会议员的网站列表.许多站点的底层标记有所不同,但是直到我开始看到数百个站点没有为我编写的脚本提供预期的结果时,这才成为问题.
在花了更多时间评估潜在原因之后,我发现在file_get_contents()结果上调用strip_tags()多次擦除了页面的大部分源代码!这不仅删除了HTML,还删除了我要抓取的非HTML!
因此,我删除了对strip_tags()的调用,替换为删除所有非字母数字字符的调用,并再次运行了该过程.结果出现了其他结果,但仍然缺乏很多结果.这次是因为我的正则表达式与所需的模式不匹配.查看返回的代码后,我意识到我的HTML属性残留物散布在整个文本中,破坏了我的模式.
有没有解决的办法?是HTML格式错误的结果吗?我能做些什么吗?
解决方法:
PHP手册中有一条警告,内容为:
Because strip_tags() does not actually
validate the HTML, partial, or broken
tags can result in the removal of more
text/data than expected.
由于您要抓取许多不同的站点,并且无法说明其HTML的有效性,因此这始终是一个问题.不幸的是,正则表达式也不会为您做到这一点,因为regexps simply aren’t cut out to be document parsers.
我会使用类似PHP Simple HTML DOM Parser的方法,甚至使用内置的DOMDocument->loadHTML()方法.
您可以保留一个小型数据库,该数据库记录要抓取的每个页面以及该页面的结构中找到信息的位置.每次抓取它时,您都可以进行快速检查以查看结构是否已更改,在这种情况下,可以使用DOM解析器的新路径位置更新数据库,并在下一次抓取中获取它.
标签:strip-tags,conflict,html,php,regex 来源: https://codeday.me/bug/20191024/1919411.html