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
还没有评论,快来发表第一个评论吧