php 读取HTML变成XML

使用 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)。


清单 9. 直接使用 XPath
				
<?php
$h4 = $xml->xpath('/html/body/div/div/div/h4');
?>

或者,您可以只使用 '//' 选项和 XPath,这将搜索所有文档,查找您要查找的标记。因此,您可以找到所有 h4,生成一个数组,然后使用下面的 XPath 访问第一个 h4:
'//h4'

遍历 HTML 分层结构

讨论上述转换和 XPath 的主要原因是,进行 Web 擦除的常见必要任务之一就是自动查找 Web 页面上的其他链接并追索它们,这允许您 “遍历” 网站,找到尽量多的信息。

如果使用 XPath,这个任务将非常麻烦。清单 10 提供了一个由所有带有 “href” 属性的 <a> 链接组成的数组,并允许您处理它们。


清单 10. 结合使用多种技术查找页面上的所有链接
				
<?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 所示。


清单 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


你可能感兴趣的:(JavaScript,html,PHP,xml,Scheme,import)