php HTML解析库用法,PHP玩转HTML(SimpleHtmlDom)

我们在生成静态页中,经常会遇到需要处理html文档,里面需要用到很多节点,插入各种动态数据,修改各种内容。我们首先想到用正则匹配内容然后修改,这样也可以的。今天我们学习一个PHP的HTML解析库,用它来处理html文档。

A HTML DOM parser written in PHP - let you manipulate HTML in a very easy way! This is a fork of PHP Simple HTML DOM Parser project but instead of string manipulation we use DOMDocument and modern php classes like "Symfony CssSelector".

  • PHP 7.0+ & 8.0 Support
  • PHP-FIG Standard
  • Composer & PSR-4 support
  • PHPUnit testing via Travis CI
  • PHP-Quality testing via SensioLabsInsight
  • UTF-8 Support (more support via "voku/portable-utf8")
  • Invalid HTML Support (partly ...)
  • Find tags on an HTML page with selectors just like jQuery
  • Extract contents from HTML in a single line


引入:使用composer下载库

composer require voku/simple_html_dom
composer require voku/portable-utf8

使用:

use voku\helper\HtmlDomParser;

require_once 'composer/autoload.php';

...
$dom = HtmlDomParser::str_get_html($str);
// or 
$dom = HtmlDomParser::file_get_html($file);

$element = $dom->findOne('#css-selector'); // "$element" === instance of "SimpleHtmlDomInterface"

$elements = $dom->findMulti('.css-selector'); // "$elements" === instance of SimpleHtmlDomNodeInterface<int, SimpleHtmlDomInterface>

$elementOrFalse = $dom->findOneOrFalse('#css-selector'); // "$elementOrFalse" === instance of "SimpleHtmlDomInterface" or false

$elementsOrFalse = $dom->findMultiOrFalse('.css-selector'); // "$elementsOrFalse" === instance of SimpleHtmlDomNodeInterface<int, SimpleHtmlDomInterface> or false
...


  • 从url中加载html文档
  • 从字符串中加载html文档
  • 从文件中加载html文档
// 新建一个Dom实例  
$html = new simple_html_dom();  
      
// 从url中加载  
$html->load_file('http://www.alingfeng.cn');  
      
// 从字符串中加载  
$html->load('<html><body>从字符串中加载html文档演示</body></html>');  
      
//从文件中加载  
$html->load_file('path/file/test.html'); 
    
//创建HTML文档
// Create a DOM object from a string   
$html = str_get_html('<html><body>Hello!</body></html>');   
// Create a DOM object from a URL   
$html = file_get_html('http://www.google.com/');   
// Create a DOM object from a HTML file   
$html = file_get_html('test.htm'); 


查找html元素

可以使用find函数来查找html文档中的元素。返回的结果是一个包含了对象的数组。我们使用HTML DOM解析类中的函数来访问这些对象,下面给出几个示例:

//查找html文档中的超链接元素  
$a = $html->find('a');  

//查找文档中第(N)个超链接,如果没有找到则返回空数组.  
$a = $html->find('a', 0);  

// 查找id为main的div元素  
$main = $html->find('div[id=main]',0);  

// 查找所有包含有id属性的div元素  
$divs = $html->find('div[id]');  

// 查找所有包含有id属性的元素  
$divs = $html->find('[id]');
// 查找id='#container'的元素  
$ret = $html->find('#container');  

// 找到所有class=foo的元素  
$ret = $html->find('.foo');  

// 查找多个html标签  
$ret = $html->find('a, img');  


// 还可以这样用  
$ret = $html->find('a[title], img[title]');
// 查找 ul列表中所有的li项  
$ret = $html->find('ul li');  

//查找 ul 列表指定class=selected的li项  
$ret = $html->find('ul li.selected');

// 返回父元素  
$e->parent;  

// 返回子元素数组  
$e->children;  

// 通过索引号返回指定子元素  
$e->children(0);  

// 返回第一个资源速  
$e->first_child ();  

// 返回最后一个子元素  
$e->last _child ();  

// 返回上一个相邻元素  
$e->prev_sibling ();  

//返回下一个相邻元素  
$e->next_sibling ();

元素属性操作
使用简单的正则表达式来操作属性选择器。

  • [attribute] – 选择包含某属性的html元素
  • [attribute=value] – 选择所有指定值属性的html元素
  • [attribute!=value]- 选择所有非指定值属性的html元素
  • [attribute^=value] -选择所有指定值开头属性的html元素
  • [attribute$=value] 选择所有指定值结尾属性的html元素
  • [attribute*=value] -选择所有包含指定值属性的html元素
// 本例中将$a的锚链接值赋给$link变量  
$link = $a->href; 
$link = $html->find('a',0)->href;

每个对象都有4个基本对象属性:

  • tag – 返回html标签名
  • innertext – 返回innerHTML
  • outertext – 返回outerHTML
  • plaintext – 返回html标签中的文本
//给$a的锚链接赋新值  
$a->href = 'http://www.jb51.net';  
// 删除锚链接  
$a->href = null;  
 
// 检测是否存在锚链接  
if(isset($a->href)) {  
    //代码  
 }

解析器中没有专门的方法来添加、删除元素,不过可以变通一下使用:

// 封装元素  
$e->outertext = '<div class="wrap">' . $e->outertext . '<div>';  
// 删除元素  
$e->outertext = '';  
// 添加元素  
$e->outertext = $e->outertext . '<div>foo<div>';  
// 插入元素  
$e->outertext = '<div>foo<div>' . $e->outertext;

$doc = $html;  
// 输出  
echo $doc;
//如何避免解析器消耗过多内存
$html->clear();

简单示例:

$html = file_get_html('http://www.alingfeng.cn/');//获取html                              
$dom = new simple_html_dom(); //new simple_html_dom对象                              
$dom->load($html)  //加载html                                              
// Find all images                                            
foreach($dom->find('img') as $element) {     
//获取img标签数组                                        
    echo $element->src . '<br>'; //获取每个img标签中的src   
}                                                         
// Find all links                                                 
foreach($dom->find('a') as $element){ //获取a标签的数组                                           
    echo $element->href . '<br>';//获取每个a标签中的href                                 
}  
$html = file_get_html('http://slashdot.org/'); //获取html                                  
$dom = new simple_html_dom(); //new simple_html_dom对象                                  
$dom->load($html); //加载html                                           
// Find all article blocks                                            
foreach($dom->find('div.article') as $article) {                                             
    $item['title'] = $article->find('div.title', 0)->plaintext; //plaintext 获取纯文本  
    $item['intro'] = $article->find('div.intro', 0)->plaintext;                                
    $item['details'] = $article->find('div.details', 0)->plaintext;                                  
    $articles[] = $item;  
}  
print_r($articles);   

// Create DOM from string      
$html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>');    
$dom = new simple_html_dom();     //new simple_html_dom对象</p><p>      
$dom->load($html);      //加载html    
$dom->find('div', 1)->class = 'bar';    //class = 赋值 给第二个div的class赋值</p><p>     
$dom->find('div[id=hello]', 0)->innertext = 'foo';   //innertext内部文本</p><p>      
echo $dom;

find示例:

find ( string $selector [, int $index] )   
// Find all anchors, returns a array of element objects a标签数组  
$ret = $html->find('a');</p><p>  // Find (N)th anchor, returns element object or null if not found (zero based)第一个a标签  
$ret = $html->find('a', 0);</p><p>   // Find lastest anchor, returns element object or null if not found (zero based)最后一个a标签  
$ret = $html->find('a', -1); </p><p> // Find all <div> with the id attribute   
$ret = $html->find('div[id]');</p><p>    // Find all <div> which attribute id=foo  
$ret = $html->find('div[id=foo]'); </p><p>  
// Find all element which id=foo  
$ret = $html->find('#foo');</p><p>   // Find all element which class=foo  
$ret = $html->find('.foo');</p><p>   // Find all element has attribute id  
$ret = $html->find('*[id]'); </p><p> // Find all anchors and images a标签与img标签数组   
$ret = $html->find('a, img');  </p><p>  // Find all anchors and images with the "title" attribute  
$ret = $html->find('a[title], img[title]');</p><p>  
// Find all <li> in <ul>   
$es = $html->find('ul li'); ul标签下的li标签数组</p><p>  // Find Nested <div> tags  
$es = $html->find('div div div');  div标签下div标签下div标签数组</p><p>   // Find all <td> in <table> which class=hello   
$es = $html->find('table.hello td'); table标签下td标签数组</p><p>   // Find all td tags with attribite align=center in table tags   
$es = $html->find(''table td[align=center]'); </p><p>   
//5.Element  //的方法  
$e = $html->find("div", 0);  //$e 所拥有的方法如下表所示  
//Attribute Name Usage   
$e->tag //标签   
$e->outertext //外文本   
$e->innertext //内文本   
$e->plaintext //纯文本 </p><p> </p><p>   // Example  
$html = str_get_html("<div>foo <b>bar</b></div>");   
echo $e->tag; // Returns: " div"  
echo $e->outertext; // Returns: " <div>foo <b>bar</b></div>"  
echo $e->innertext; // Returns: " foo <b>bar</b>"  
echo $e->plaintext; // Returns: " foo bar"</p><p>  
/6.DOM traversing 方法  
//Method Description   
mixed$e->children ( [int $index] ) //子元素   
element$e->parent () //父元素   
element$e->first_child () //第一个子元素   
element$e->last_child () //最后一个子元素   
element$e->next_sibling () //后一个兄弟元素   
element$e->prev_sibling () //前一个兄弟元素 </p><p>  
// Example  
echo $html->find("#div1", 0)->children(1)->children(1)->children(2)->id;  
// or   
echo $html->getElementById("div1")->childNodes(1)->childNodes(1)->childNodes(2)->getAttribute('id');

参考链接:

https://github.com/voku/simple_html_dom

https://blog.csdn.net/qq_36025814/article/details/89500333

点赞0
点击评论1
收藏0
浏览 122
 

还没有评论,快来发表第一个评论吧

免责声明:凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证有关资料的准确性及可靠性,注册用户和一般页面游览者在使用前请进一步核实,并对任何自主决定的行为负责。本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任(包括侵权责任、合同责任和其它责任)
*尊重作者,转载请注明出处!