3

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

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

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

有没有解决的办法?它是格式错误的 HTML 的结果吗?我能做些什么吗?

4

2 回答 2

5

PHP手册中有一条警告如下:

因为 strip_tags() 实际上并不验证 HTML,部分或损坏的标签可能会导致删除比预期更多的文本/数据。

由于您正在抓取许多不同的站点,并且您无法解释其 HTML 的有效性,因此这始终是个问题。不幸的是,regexps 也不会为你做这件事,因为regexps 根本不适合作为文档解析器

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

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

于 2009-12-29T01:21:06.060 回答
0

Malformed html may very well be the cause.
You could try to load the pages via DOMDocument::loadhtmlfile(). May it is able to "fix" the errors.
Also take a look at libxml_use_internal_errors() as it might help you to identify and handle the problems.

于 2009-12-29T01:21:28.290 回答