Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 99精品国产兔费观看久久99,欧美视频成人,国禁国产you女视频网站

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          PHP中使用DOMDocument來處理HTML、XML文檔

          實從PHP5開始,PHP就為我們提供了一個強大的解析和生成XML相關操作的類,也就是我們今天要講的 DOMDocument 類。不過我估計大部分人在爬取網頁時還是會喜歡用正則去解析網頁內容,學了今天的這個類下回就可以嘗試下使用這個PHP自帶的方式來進行解析分析了。

          解析HTML

          // 解析 HTML
          $baidu = file_get_contents('https://www.baidu.com');
          
          $doc = new DOMDocument();
          @$doc->loadHTML($baidu);
          
          // 百度輸出框
          $inputSearch = $doc->getElementById('kw');
          var_dump($inputSearch);
          
          // object(DOMElement)#2 
          //     ....
          
          echo $inputSearch->getAttribute('name'), PHP_EOL; // wd
          
          // 獲取所有圖片的鏈接
          $allImageLinks = [];
          $imgs = $doc->getElementsByTagName('img');
          foreach($imgs as $img){
              $allImageLinks[] = $img->getAttribute('src');
          }
          
          print_r($allImageLinks);
          
          // Array
          // (
          //     [0] => //www.baidu.com/img/baidu_jgylogo3.gif
          //     [1] => //www.baidu.com/img/bd_logo.png
          //     [2] => http://s1.bdstatic.com/r/www/cache/static/global/img/gs_237f015b.gif
          // )
          
          // 利用 parse_url 分析鏈接
          foreach($allImageLinks as $link){
              print_r(parse_url($link));
          }
          
          // Array
          // (
          //     [host] => www.baidu.com
          //     [path] => /img/baidu_jgylogo3.gif
          // )
          // Array
          // (
          //     [host] => www.baidu.com
          //     [path] => /img/bd_logo.png
          // )
          // Array
          // (
          //     [scheme] => http
          //     [host] => s1.bdstatic.com
          //     [path] => /r/www/cache/static/global/img/gs_237f015b.gif
          // )
          

          是不是感覺好清晰,好有面向對象的感覺。就像第一次使用 ORM庫 來進行數據庫操作一樣的感覺。我們一段一段來看。

          $baidu = file_get_contents('https://www.baidu.com');
          
          $doc = new DOMDocument();
          @$doc->loadHTML($baidu);
          

          首先是加載文檔內容,這個比較好理解,直接使用 loadHTML() 方法加載 HTML 內容。它還提供了其它的幾個方法,分別是:load() 從一個文件加載XML;loadXML() 從字符串加載XML;loadHTMLFile() 從文件加載HTML。

          // 百度輸出框
          $inputSearch = $doc->getElementById('kw');
          var_dump($inputSearch);
          
          // object(DOMElement)#2 
          //     ....
          
          echo $inputSearch->getAttribute('name'), PHP_EOL; // wd
          

          接下來我們使用和前端 JS 一樣的 DOM 操作API來操作HTML里面的元素。這個例子中就是獲取百度的文本框,直接使用 getElementById() 方法獲得id為指定內容的 DOMElement 對象。然后就可以獲取它的值、屬性之類的內容了。

          // 獲取所有圖片的鏈接
          $allImageLinks = [];
          $imgs = $doc->getElementsByTagName('img');
          foreach($imgs as $img){
              $allImageLinks[] = $img->getAttribute('src');
          }
          
          print_r($allImageLinks);
          
          // Array
          // (
          //     [0] => //www.baidu.com/img/baidu_jgylogo3.gif
          //     [1] => //www.baidu.com/img/bd_logo.png
          //     [2] => http://s1.bdstatic.com/r/www/cache/static/global/img/gs_237f015b.gif
          // )
          
          // 利用 parse_url 分析鏈接
          foreach($allImageLinks as $link){
              print_r(parse_url($link));
          }
          
          // Array
          // (
          //     [host] => www.baidu.com
          //     [path] => /img/baidu_jgylogo3.gif
          // )
          // Array
          // (
          //     [host] => www.baidu.com
          //     [path] => /img/bd_logo.png
          // )
          // Array
          // (
          //     [scheme] => http
          //     [host] => s1.bdstatic.com
          //     [path] => /r/www/cache/static/global/img/gs_237f015b.gif
          // )
          

          這一段例子則是獲取HTML文檔中所有的圖片鏈接。相比正則來說,是不是方便很多,而且代碼本身就是自解釋的,不用考慮正則的匹配失效的問題。配合另外一個PHP中自帶的 parse_url() 方法也能非常方便地對鏈接進行分析,提取自己想要的內容。

          XML的解析和對HTML的解析也是類似的,都使用 DOMDocument 和 DOMElement 提供的這個方法接口就可以很方便的進行解析了。那么我們想要生成一個標準格式的XML呢?當然也非常的簡單,不需要再去拼接字符串了,使用這個類一樣的進行對象化的操作。

          生成一個XML

          // 生成一個XML文檔
          $xml = new DOMDocument('1.0', 'UTF-8');
          
          $node1 = $xml->createElement('First', 'This is First Node.');
          $node1->setAttribute('type', '1');
          
          $node2 = $xml->createElement('Second');
          $node2->setAttribute('type', '2');
          $node2_child = $xml->createElement('Second-Child', 'This is Second Node Child.');
          $node2->appendChild($node2_child);
          
          $xml->appendChild($node1);
          $xml->appendChild($node2);
          print $xml->saveXML();
          
          /*
          <?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>
          */
          

          其實只要有一點點的前端 JS 的基礎都不難看出這段代碼的含義。使用 createElement() 方法創造 DOMElement 對象,然后就可以為它添加屬性和內容。使用 appendChild() 方法就可以為當前的 DOMElement 或者 DOMDocument 添加下級節點。最后使用 saveXML() 就能夠生成標準的XML格式內容了。

          總結

          通過上面兩個簡單的小例子,相信大家已經對這個 DOMDocument 操作XML類文件解析的方式非常感興趣了。不過相對于正則解析的方式它們的性能有多大的差異并沒有找到相關的測試,不過一般正常的情況下網站的HMTL文檔都不會太大,畢竟各個網站也會考慮自身的加載速度,如果文檔非常大的話用戶體驗也會很差,所以這套接口用來進行日常爬蟲的分析處理工作基本是沒有任何問題的。

          測試代碼: https://github.com/zhangyue0503/dev-blog/blob/master/php/202002/source/PHP%E4%B8%AD%E4%BD%BF%E7%94%A8DOMDocument%E6%9D%A5%E5%A4%84%E7%90%86HTML%E3%80%81XML%E6%96%87%E6%A1%A3.php

          參考文檔: https://www.php.net/manual/zh/class.domdocument.php

          用 load 方法的完整格式是:load( url, [data], [callback] ),其中

          url:是指要導入文件的地址。

          data:可選參數;因為 Load 不僅僅可以導入靜態的 html 文件,還可以導入動態腳本,例如 PHP文件,所以要導入的是動態文件時,我們可以把要傳遞的參數放在這里。

          callback:可選參數;是指調用 load 方法并得到服務器響應后,再執行的另外一個函數。

          該方法是最簡單的從服務器獲取數據的方法。它幾乎與 $.get(url, data, success)等價,不同的是它不是全局函數,并且它擁有隱式的回調函數。當偵測到成功的響應時(比如,當textStatus為 "success" 或 "notmodified" 時),.load() 將匹配元素的 HTML 內容設置為返回的數據。這意味著該方法的大多數使用會非常簡單:

          $("#result").load("ajax/test.html");

          如果提供回調函數,則會在執行 post-processing 之后執行該函數:

          $("#result").load("ajax/test.html", function() {

          alert("Load was performed.");

          });

          上面的兩個例子中,如果當前文檔不包含 "result" ID,則不會執行.load()方法。

          如果提供的數據是對象,則使用 POST 方法;否則使用 GET 方法。


          主站蜘蛛池模板: 无码人妻久久久一区二区三区| 国产福利电影一区二区三区,免费久久久久久久精 | 无码人妻精品一区二区三区蜜桃| 无码人妻品一区二区三区精99| 日韩在线视频不卡一区二区三区 | 国产精品乱码一区二区三区 | 日本v片免费一区二区三区 | 久久国产精品亚洲一区二区| 亚洲AV综合色区无码一区爱AV| 一区二区三区福利| 国产综合精品一区二区| 丰满岳妇乱一区二区三区| 激情综合一区二区三区| 中文字幕精品一区二区2021年| 色屁屁一区二区三区视频国产| 一区二区三区四区在线播放| 无码人妻久久久一区二区三区| 国产精品美女一区二区| 精品人妻一区二区三区毛片| 无码精品人妻一区二区三区漫画| 色综合视频一区中文字幕| 高清一区二区三区| 国产经典一区二区三区蜜芽| 国内精品视频一区二区八戒| 国产MD视频一区二区三区| 日韩AV无码一区二区三区不卡毛片| 亚洲av乱码一区二区三区| www亚洲精品少妇裸乳一区二区 | 国产成人精品视频一区| 99精品高清视频一区二区| 国产乱人伦精品一区二区| 另类ts人妖一区二区三区| 日韩AV在线不卡一区二区三区| 欧洲无码一区二区三区在线观看 | 中文字幕在线不卡一区二区| 久久国产免费一区| 成人精品一区二区激情| 中文字幕无码免费久久9一区9| 99久久精品费精品国产一区二区| 日韩人妻无码一区二区三区综合部| 一本AV高清一区二区三区|