php 读取HTML变成XML
2011-09-13 17:55
246 查看
使用 DOM 方法来获取 Web 页面的 SimpleXML 版本
现在,您可以像对其他 XML 文档一样遍历 HTML 页面。因此,您现在可以使用
但是,正如您从上一个示例中可以预料到的那样,试图从一个 HTML 页面中查找数据有时可能非常不便,这是因为 HTML 页面通常不像 XML 文件那样有良好的结构。上面那行代码查找三个嵌套的 div 中的第一个 h4;在每种情况下,它都会查找每个父 div 中的第一个 div。
幸运的是,如果您只想查找页面上的第一个 h4,或者其他 “直接数据”,那么 XPath 是一种更简单的实现方法。XPath 是一个非常强大的工具,可以将它作为整个文章系列的主题(请参阅
参考资料 中列示的部分文章)。简言之,可以使用
清单 9)。
清单 9. 直接使用 XPath
或者,您可以只使用
遍历 HTML 分层结构
讨论上述转换和 XPath 的主要原因是,进行 Web 擦除的常见必要任务之一就是自动查找 Web 页面上的其他链接并追索它们,这允许您 “遍历” 网站,找到尽量多的信息。
如果使用 XPath,这个任务将非常麻烦。清单 10 提供了一个由所有带有 “href” 属性的 <a> 链接组成的数组,并允许您处理它们。
清单 10. 结合使用多种技术查找页面上的所有链接
现在,上面的代码找到了所有
一种更简单的方法是使用 PHP 的内置
清单 11 所示。
清单 11. 一个更健壮的站点遍历程序
关于 HTML 解析的最后一点说明是,对于所有 XML 类语言的一个统一接口,您复习了如何只使用 DOM 扩展将 HTML 转换回 SimpleXML。注意,DOM 库本身非常强大,可以直接使用。如果您非常熟悉 JavaScript 和使用
您目前应该已经拥有了从 Web 页面上擦除数据所需的工具。一旦您熟悉了本文前面详细介绍的技术,就可以从 Web 页面上读取任何信息,而不仅限于可以关注的链接。我们希望您不必执行这个任务,因为已经存在 API 或其他数据源。
更详细内容请参照:http://www.ibm.com/developerworks/cn/xml/x-datamineparsephp/index.html
<?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 } } } ?> |
getElementsByTagName之类的工具来遍历 DOM 文档树,那么您完全可以只使用 DOM 库,不使用 SimpleXML。
您目前应该已经拥有了从 Web 页面上擦除数据所需的工具。一旦您熟悉了本文前面详细介绍的技术,就可以从 Web 页面上读取任何信息,而不仅限于可以关注的链接。我们希望您不必执行这个任务,因为已经存在 API 或其他数据源。
更详细内容请参照:http://www.ibm.com/developerworks/cn/xml/x-datamineparsephp/index.html
相关文章推荐
- 从数据库读取带有HTML或者XML内容的问题时
- PHP 挖掘 XML 和 HTML 数据
- PHP中通过SimpleXMLElement配合DOMDocument提取XML中的HTML内容
- xml和html混合和php应用程序使用xml
- PHP读取XML
- 网络爬虫之php抓取json,xml,js,html示例分析及数据解析
- PHP读取XML值的代码(推荐)
- php读取xml实例代码
- PHP读取xml方法讲解
- 云服务PHP读取XML问题失败的问题解决方法
- php 读取xml
- asp.net c# 如何读取XML文件里的CDATA里的HTML
- php将xml变成array
- 用 PHP 读取和编写 XML
- PHP 操作 XML 文件 - 读取、显示
- PHP读取4种配置文件(php,ini,yaml,xml)
- PHP 挖掘 XML 和 HTML 数据
- PHP读取XML数据中CDATA内数值
- java URL类、URLConnection类读取html或xml信息
- PHP中使用DOM读取解析XML属性值一例