其实从PHP5开始,PHP就为我们提供了一个强大的解析和生成XML相关操作的类,也就是我们今天要讲的 DOMDocument 类。不过我估计大部分人在爬取网页时还是会喜欢用正则去解析网页内容,学了今天的这个类下回就可以尝试下使用这个PHP自带的方式来进行解析分析了。

解析HTML
// 解析 HTML
$baidu = file_get_contents(‘https://www.baidu.com‘);

  1. $doc = new DOMDocument();
  2. @$doc->loadHTML($baidu);
  3. // 百度输出框
  4. $inputSearch = $doc->getElementById('kw');
  5. var_dump($inputSearch);
  6. // object(DOMElement)#2
  7. // ....
  8. echo $inputSearch->getAttribute('name'), PHP_EOL; // wd
  9. // 获取所有图片的链接
  10. $allImageLinks = [];
  11. $imgs = $doc->getElementsByTagName('img');
  12. foreach($imgs as $img){
  13. $allImageLinks[] = $img->getAttribute('src');
  14. }
  15. print_r($allImageLinks);
  16. // Array
  17. // (
  18. // [0] => //www.baidu.com/img/baidu_jgylogo3.gif
  19. // [1] => //www.baidu.com/img/bd_logo.png
  20. // [2] => http://s1.bdstatic.com/r/www/cache/static/global/img/gs_237f015b.gif
  21. // )
  22. // 利用 parse_url 分析链接
  23. foreach($allImageLinks as $link){
  24. print_r(parse_url($link));
  25. }
  26. // Array
  27. // (
  28. // [host] => www.baidu.com
  29. // [path] => /img/baidu_jgylogo3.gif
  30. // )
  31. // Array
  32. // (
  33. // [host] => www.baidu.com
  34. // [path] => /img/bd_logo.png
  35. // )
  36. // Array
  37. // (
  38. // [scheme] => http
  39. // [host] => s1.bdstatic.com
  40. // [path] => /r/www/cache/static/global/img/gs_237f015b.gif
  41. // )

是不是感觉好清晰,好有面向对象的感觉。就像第一次使用 ORM库 来进行数据库操作一样的感觉。我们一段一段来看。
$baidu = file_get_contents(‘https://www.baidu.com‘);

  1. $doc = new DOMDocument();
  2. @$doc->loadHTML($baidu);

首先是加载文档内容,这个比较好理解,直接使用 loadHTML() 方法加载 HTML 内容。它还提供了其它的几个方法,分别是:load() 从一个文件加载XML;loadXML() 从字符串加载XML;loadHTMLFile() 从文件加载HTML。
// 百度输出框
$inputSearch = $doc->getElementById(‘kw’);
var_dump($inputSearch);

  1. // object(DOMElement)#2
  2. // ....
  3. echo $inputSearch->getAttribute('name'), PHP_EOL; // wd

首先是加载文档内容,这个比较好理解,直接使用 loadHTML() 方法加载 HTML 内容。它还提供了其它的几个方法,分别是:load() 从一个文件加载XML;loadXML() 从字符串加载XML;loadHTMLFile() 从文件加载HTML。
// 百度输出框
$inputSearch = $doc->getElementById(‘kw’);
var_dump($inputSearch);

  1. // object(DOMElement)#2
  2. // ....

接下来我们使用和前端 JS 一样的 DOM 操作API来操作HTML里面的元素。这个例子中就是获取百度的文本框,直接使用 getElementById() 方法获得id为指定内容的 DOMElement 对象。然后就可以获取它的值、属性之类的内容了。
// 获取所有图片的链接
$allImageLinks = [];
$imgs = $doc->getElementsByTagName(‘img’);
foreach($imgs as $img){
$allImageLinks[] = $img->getAttribute(‘src’);
}

  1. print_r($allImageLinks);
  2. // Array
  3. // (
  4. // [0] => //www.baidu.com/img/baidu_jgylogo3.gif
  5. // [1] => //www.baidu.com/img/bd_logo.png
  6. // [2] => http://s1.bdstatic.com/r/www/cache/static/global/img/gs_237f015b.gif
  7. // )
  8. // 利用 parse_url 分析链接
  9. foreach($allImageLinks as $link){
  10. print_r(parse_url($link));
  11. }
  12. // Array
  13. // (
  14. // [host] => www.baidu.com
  15. // [path] => /img/baidu_jgylogo3.gif
  16. // )
  17. // Array
  18. // (
  19. // [host] => www.baidu.com
  20. // [path] => /img/bd_logo.png
  21. // )
  22. // Array
  23. // (
  24. // [scheme] => http
  25. // [host] => s1.bdstatic.com
  26. // [path] => /r/www/cache/static/global/img/gs_237f015b.gif
  27. // )

这一段例子则是获取HTML文档中所有的图片链接。相比正则来说,是不是方便很多,而且代码本身就是自解释的,不用考虑正则的匹配失效的问题。配合另外一个PHP中自带的 parse_url() 方法也能非常方便地对链接进行分析,提取自己想要的内容。

XML的解析和对HTML的解析也是类似的,都使用 DOMDocument 和 DOMElement 提供的这个方法接口就可以很方便的进行解析了。那么我们想要生成一个标准格式的XML呢?当然也非常的简单,不需要再去拼接字符串了,使用这个类一样的进行对象化的操作。

生成一个XML
// 生成一个XML文档
$xml = new DOMDocument(‘1.0’, ‘UTF-8’);

  1. $node1 = $xml->createElement('First', 'This is First Node.');
  2. $node1->setAttribute('type', '1');

de2 = $xml->createElement(‘Second’);
$node2->setAttribute(‘type’, ‘2’);
$node2_child = $xml->createElement(‘Second-Child’, ‘This is Second Node Child.’);
$node2->appendChild($node2_child);

  1. $xml->appendChild($node1);
  2. $xml->appendChild($node2);
  3. print $xml->saveXML();

其实只要有一点点的前端 JS 的基础都不难看出这段代码的含义。使用 createElement() 方法创造 DOMElement 对象,然后就可以为它添加属性和内容。使用 appendChild() 方法就可以为当前的 DOMElement 或者 DOMDocument 添加下级节点。最后使用 saveXML() 就能够生成标准的XML格式内容了。
/
<?xml version=”1.0” encoding=”UTF-8”?>
<First type="1">This is First Node.</First>
<Second type="2"><Second-Child>This is Second Node Child.</Second-Child></Second>
/
echo $inputSearch->getAttribute(‘name’), PHP_EOL; // wd

更多相关文章

  1. android获取短信所有内容
  2. 轮播网络图片加载适配
  3. andorid RecyclerView下拉刷新,上拉加载更多
  4. Android实现雅虎新闻摘要加载视差动画效果
  5. Android轮播图Banner使用方法
  6. Android标准Glide加载圆形图和圆角矩形图
  7. Android动态添加布局
  8. 仿php中文网右侧内容
  9. Android应用开发提高系列(4)——Android动态加载(上)——加载未安装A

随机推荐

  1. 整理出来的一些Android基础知识
  2. input 之我见1
  3. 2010.12.14——— android 应用的自动更
  4. Google Android admob
  5. android图片闪烁或帧动画
  6. Mac下完全卸载干净Android Studio
  7. msm8916 lcd 相关调试点指导
  8. android studio 调试android源码
  9. Android编程权威指南(第二版)— 第10章挑战
  10. 【Android】TV端项目开发挖坑总结