使用 DOM 方法来获取 Web 页面的 SimpleXML 版本
<?php $dom = new DOMDocument(); $dom->loadHTMLFile('http://example.com/'); $xml = simplexml_import_dom($dom); ?>
现在,您可以像对其他 XML 文档一样遍历 HTML 页面。因此,您现在可以使用 $xml->head->title
来访问页面标题,或者使用 $xml->body->div[0]->div[0]->div[0]->h4[0]
这样的引用来深入页面。
但是,正如您从上一个示例中可以预料到的那样,试图从一个 HTML 页面中查找数据有时可能非常不便,这是因为 HTML 页面通常不像 XML 文件那样有良好的结构。上面那行代码查找三个嵌套的 div 中的第一个 h4;在每种情况下,它都会查找每个父 div 中的第一个 div。
幸运的是,如果您只想查找页面上的第一个 h4,或者其他 “直接数据”,那么 XPath 是一种更简单的实现方法。XPath 是一个非常强大的工具,可以将它作为整个文章系列的主题(请参阅 参考资料 中列示的部分文章)。简言之,可以使用 '/'
来描述层级关系;因此,可以将前面的引用重写为下面的 XPath 搜索(请参见 清单 9)。
<?php $h4 = $xml->xpath('/html/body/div/div/div/h4'); ?> |
或者,您可以只使用 '//'
选项和 XPath,这将搜索所有文档,查找您要查找的标记。因此,您可以找到所有 h4,生成一个数组,然后使用下面的 XPath 访问第一个 h4:
'//h4'
遍历 HTML 分层结构
讨论上述转换和 XPath 的主要原因是,进行 Web 擦除的常见必要任务之一就是自动查找 Web 页面上的其他链接并追索它们,这允许您 “遍历” 网站,找到尽量多的信息。
如果使用 XPath,这个任务将非常麻烦。清单 10 提供了一个由所有带有 “href” 属性的 <a> 链接组成的数组,并允许您处理它们。
<?php $dom = new DOMDocument(); $dom->loadHTMLFile('http://example.com/'); $xml = simplexml_import_dom($dom); $links = $xml->xpath('//a[@href]'); foreach ($links as $l) { echo $l['href'], "<br />\n"; } ?> |
现在,上面的代码找到了所有 <a href="">
链接,但如果您打开您发现的每个可能链接,您就开始快速 “爬行” 整个 Web。因此,最好增强您的代码,确保只访问两类链接:一类是有效的 HTML 链接(不是 FTP 或 JavaScript);一类是只返回(通过完整或相对域链接)同一个网站的链接。
一种更简单的方法是使用 PHP 的内置 parse_url()
函数在这些链接上进行迭代,该函数为您处理大量资格审查,如 清单 11 所示。
<?php $dom = new DOMDocument(); $host = 'example.com'; $dom->loadHTMLFile("http://{$host}/"); $xml = simplexml_import_dom($dom); $links = $xml->xpath('//a[@href]'); foreach ($links as $l) { $p = parse_url($l['href']); if (empty($p['scheme']) || in_array($p['scheme'], array('http', 'https'))) { if (empty($p['host']) || ($host == $p['host'])) { echo $l['href'], "<br />\n"; // Handle URL iteration here } } } ?> |
关于 HTML 解析的最后一点说明是,对于所有 XML 类语言的一个统一接口,您复习了如何只使用 DOM 扩展将 HTML 转换回 SimpleXML。注意,DOM 库本身非常强大,可以直接使用。如果您非常熟悉 JavaScript 和使用 getElementsByTagName
之类的工具来遍历 DOM 文档树,那么您完全可以只使用 DOM 库,不使用 SimpleXML。
您目前应该已经拥有了从 Web 页面上擦除数据所需的工具。一旦您熟悉了本文前面详细介绍的技术,就可以从 Web 页面上读取任何信息,而不仅限于可以关注的链接。我们希望您不必执行这个任务,因为已经存在 API 或其他数据源。
更详细内容请参照:http://www.ibm.com/developerworks/cn/xml/x-datamineparsephp/index.html