简单的PHP HTML DOM 解析器 中文手册 | PHP Simple HTML DOM Parser中文手册
目录
- 快速入门
- 如何创建HTML DOM 对象?
- 如何查找HTML元素?
- 如何访问HTML元素的属性?
- 如何遍历DOM树?
- 如何储存DOM对象中的内容?
- 如何自定义解析器方法?
- API 参考
- FAQ
快速入门
Top- 获取HTML元素
- 修改HTML元素
- 从HTML中提取内容
- 提取Slashdot!
//从一个URL或者文件创建一个DOM对象
$html =?file_get_html('http://www.google.cn/');
// 寻找所有的img标签?
foreach($html->find('img') as $element)?
?????? echo $element->src?.?'<br>';
// 寻找所有的链接标签
foreach($html->find('a') as $element)?
?????? echo $element->href?.?'<br>';
$html =?file_get_html('http://www.google.cn/');
// 寻找所有的img标签?
foreach($html->find('img') as $element)?
?????? echo $element->src?.?'<br>';
// 寻找所有的链接标签
foreach($html->find('a') as $element)?
?????? echo $element->href?.?'<br>';
//从字符串创建一个DOM对象
$html =?str_get_html('<div id="hello">Hello</div><div id="world">World</div>');
$html->find('div', 1)->class?=?'bar';
$html->find('div[id=hello]', 0)->innertext?=?'foo';
echo $html;?// 输出: <div id="hello">foo</div><div id="world"?class="bar">World</div>
$html =?str_get_html('<div id="hello">Hello</div><div id="world">World</div>');
$html->find('div', 1)->class?=?'bar';
$html->find('div[id=hello]', 0)->innertext?=?'foo';
echo $html;?// 输出: <div id="hello">foo</div><div id="world"?class="bar">World</div>
// 从HTML中提取内容(不包含标签)
echo?file_get_html('http://www.google.com/')->plaintext;?
//从URL创建一个DOM对象
$html =?file_get_html('http://slashdot.org/');
// 寻找所有的article块
foreach($html->find('div.article') as $article) {
????$item['title']?????= $article->find('div.title',?0)->plaintext;
????$item['intro']????= $article->find('div.intro',?0)->plaintext;
????$item['details']?= $article->find('div.details',?0)->plaintext;
????$articles[] = $item;
}
print_r($articles);
$html =?file_get_html('http://slashdot.org/');
// 寻找所有的article块
foreach($html->find('div.article') as $article) {
????$item['title']?????= $article->find('div.title',?0)->plaintext;
????$item['intro']????= $article->find('div.intro',?0)->plaintext;
????$item['details']?= $article->find('div.details',?0)->plaintext;
????$articles[] = $item;
}
print_r($articles);
如何创建HTML DOM 对象?
Top- 一般的方法
- 面向对象的方法
//从字符串创建一个DOM对象
$html =?str_get_html('<html><body>Hello!</body></html>');
//从一个URL创建一个DOM对象
$html =?file_get_html('http://www.google.com/');
//从一个HTML文件创建一个DOM对象
$html =?file_get_html('test.htm');
$html =?str_get_html('<html><body>Hello!</body></html>');
//从一个URL创建一个DOM对象
$html =?file_get_html('http://www.google.com/');
//从一个HTML文件创建一个DOM对象
$html =?file_get_html('test.htm');
//创建一个DOM对象
$html = new?simple_html_dom();
//从字符串中载入HTML
$html->load('<html><body>Hello!</body></html>');
//从URL中载入HTML?
$html->load_file('http://www.google.cn/');
//从文件中载入HTML?
$html->load_file('test.htm');?
//输出?
echo $html;
$html = new?simple_html_dom();
//从字符串中载入HTML
$html->load('<html><body>Hello!</body></html>');
//从URL中载入HTML?
$html->load_file('http://www.google.cn/');
//从文件中载入HTML?
$html->load_file('test.htm');?
//输出?
echo $html;
如何查找HTML元素?
Top- 基本方法
- 高级方法
- 后代选择器
- 嵌套选择器
- 属性过滤器
- 文本与评论
// 查找所有的锚, 返回一个元素对象数组
$ret = $html->find('a');
//查找第N个?锚, 返回元素对象或者当找不到时返回null?(从零开始)
$ret = $html->find('a',?0);
//查找最后一个?锚, 返回元素对象或者当找不到时返回null?(从零开始)
$ret = $html->find('a',?-1);?
//通过id属性 查找所有的<div>
$ret = $html->find('div[id]');
// 查找所有属性id=foo的<div>标签
$ret = $html->find('div[id=foo]');?
$ret = $html->find('a');
//查找第N个?锚, 返回元素对象或者当找不到时返回null?(从零开始)
$ret = $html->find('a',?0);
//查找最后一个?锚, 返回元素对象或者当找不到时返回null?(从零开始)
$ret = $html->find('a',?-1);?
//通过id属性 查找所有的<div>
$ret = $html->find('div[id]');
// 查找所有属性id=foo的<div>标签
$ret = $html->find('div[id=foo]');?
//查找所有id=foo的元素
$ret = $html->find('#foo');
//查找所有class=foo的元素
$ret = $html->find('.foo');
//查找所有包含id属性的的元素
$ret = $html->find('*[id]');?
//查找所有的锚与图片
$ret = $html->find('a, img');?
//查找所有包含title属性的锚与图片
$ret = $html->find('a[title], img[title]');
$ret = $html->find('#foo');
//查找所有class=foo的元素
$ret = $html->find('.foo');
//查找所有包含id属性的的元素
$ret = $html->find('*[id]');?
//查找所有的锚与图片
$ret = $html->find('a, img');?
//查找所有包含title属性的锚与图片
$ret = $html->find('a[title], img[title]');
在属性过滤器中支持如下运算符:
过滤器 描述
过滤器 描述
[属性] | 匹配包含指定属性的元素. |
[!属性] | 匹配不包含指定属性的元素. |
[属性=value] | 匹配等于特定值的指定属性的元素. |
[属性!=value] | 匹配除包含特定值的指定属性之外的元素 |
[属性^=value] | 匹配包含特定前缀的值的指定属性的元素. |
[属性$=value] | 匹配包含特定后缀的值的指定属性的元素. |
[属性*=value] | 匹配包含特定值的指定属性的元素.. |
//在<ul>中查找所有的<li>后代
$es = $html->find('ul li');
//查找所有的<div>嵌套标签
$es = $html->find('div div div');?
//在<table>中查找所有的class=hello的<td>后代?
$es = $html->find('table.hello td');
//在table标签中查找所有属性align=center的td
$es = $html->find(''table?td[align=center]');
$es = $html->find('ul li');
//查找所有的<div>嵌套标签
$es = $html->find('div div div');?
//在<table>中查找所有的class=hello的<td>后代?
$es = $html->find('table.hello td');
//在table标签中查找所有属性align=center的td
$es = $html->find(''table?td[align=center]');
//查找所有的text区块
$es = $html->find('text');
//查找所有的comment (<!--...-->)区块
$es = $html->find('comment');
$es = $html->find('text');
//查找所有的comment (<!--...-->)区块
$es = $html->find('comment');
//在<ul>中查找所有的<li>
foreach($html->find('ul') as $ul)?
{
?????? foreach($ul->find('li') as $li)?
?????? {
?????????????//在这里执行操作...
?????? }
}
//在第一个<ul>中查找第一个<li>?
$e = $html->find('ul',?0)->find('li',?0);
foreach($html->find('ul') as $ul)?
{
?????? foreach($ul->find('li') as $li)?
?????? {
?????????????//在这里执行操作...
?????? }
}
//在第一个<ul>中查找第一个<li>?
$e = $html->find('ul',?0)->find('li',?0);
如何访问HTML元素的属性?
Top- 获取,设置以及删除属性
- 魔法属性
- 提示
//?获取属性(如果是一个空值属性(例如. checked, selected...这些属性),则返回true或者false)
$value = $e->href;
//?设置属性(如果是一个空值属性(例如. checked, selected...这些属性),则让值等于true或者false)
$e->href?=?'my link';
//?删除属性,让其值为空!?
$e->href?=?null;
//?确定某个属性是否存在??
if(isset($e->href))?
????????echo?'href exist!';
$value = $e->href;
//?设置属性(如果是一个空值属性(例如. checked, selected...这些属性),则让值等于true或者false)
$e->href?=?'my link';
//?删除属性,让其值为空!?
$e->href?=?null;
//?确定某个属性是否存在??
if(isset($e->href))?
????????echo?'href exist!';
// 列子
$html =?str_get_html("<div>foo <b>bar</b></div>");?
$e = $html->find("div",?0);
echo $e->tag;?// 返回: "?div"
echo $e->outertext;?// 返回: "?<div>foo <b>bar</b></div>"
echo $e->innertext;?// 返回: "?foo <b>bar</b>"
echo $e->plaintext;?// 返回: "?foo?bar"
属性名 用法
$html =?str_get_html("<div>foo <b>bar</b></div>");?
$e = $html->find("div",?0);
echo $e->tag;?// 返回: "?div"
echo $e->outertext;?// 返回: "?<div>foo <b>bar</b></div>"
echo $e->innertext;?// 返回: "?foo <b>bar</b>"
echo $e->plaintext;?// 返回: "?foo?bar"
属性名 用法
$e->tag | Read or write the?tag name?of element. |
$e->outertext | Read or write the?outer HTML text?of element. |
$e->innertext | Read or write the?inner HTML text?of element. |
$e->plaintext | Read or write the?plain text?of element. |
//?Extract?contents from HTML?
echo?$html->plaintext;
//?Wrap?a element
$e->outertext?=?'<div class="wrap">'?. $e->outertext?.?'<div>';
//?Remove?a element, set it's outertext as an empty string?
$e->outertext?=?'';
//?Append?a element
$e->outertext?= $e->outertext?.?'<div>foo<div>';
//?Insert?a element
$e->outertext?=?'<div>foo<div>' . $e->outertext;
echo?$html->plaintext;
//?Wrap?a element
$e->outertext?=?'<div class="wrap">'?. $e->outertext?.?'<div>';
//?Remove?a element, set it's outertext as an empty string?
$e->outertext?=?'';
//?Append?a element
$e->outertext?= $e->outertext?.?'<div>foo<div>';
//?Insert?a element
$e->outertext?=?'<div>foo<div>' . $e->outertext;
如何遍历DOM树?
Top- 背景知识
- 遍历DOM树
//如果你不是很熟悉HTML DOM,那么请点击这个链接查看更多资料...?
//列子
echo $html->find("#div1", 0)->children(1)->children(1)->children(2)->id;
//或者?
echo $html->getElementById("div1")->childNodes(1)->childNodes(1)->childNodes(2)->getAttribute('id');
//列子
echo $html->find("#div1", 0)->children(1)->children(1)->children(2)->id;
//或者?
echo $html->getElementById("div1")->childNodes(1)->childNodes(1)->childNodes(2)->getAttribute('id');
你也可以使用骆驼命名法调用.
方法 描述
方法 描述
mixed
$e->children?(?[int $index]?) |
Returns the Nth?child object?if?index?is set, otherwise return an?array of children. |
element
$e->parent?() |
Returns the?parent?of element. |
element
$e->first_child?() |
Returns the?first child?of element, or?null?if not found. |
element
$e->last_child?() |
Returns the?last child?of element, or?null?if not found. |
element
$e->next_sibling?() |
Returns the?next sibling?of element, or?null?if not found. |
element
$e->prev_sibling?() |
Returns the?previous sibling?of element, or?null?if not found. |
如何储存DOM对象中的内容?
Top- 一般的方法
- 面向对象的方法
//?将DOM树中的内容储存在字符串中
$str = $html->save();
//将DOM树中的内容储存在文件中?
$html->save('result.htm');
$str = $html->save();
//将DOM树中的内容储存在文件中?
$html->save('result.htm');
//?将DOM树中的内容储存在字符串中?
$str = $html;
//打印输出!
echo $html;?
$str = $html;
//打印输出!
echo $html;?
如何自定义解析器方法?
Top- Callback 函数
//创建一个带有"$element"参数的函数
function my_callback($element) {
????????//隐藏所有的<b>标签
????????if ($element->tag=='b')
????????????????$element->outertext = '';
}?
//用它的函数名注册callback函数
$html->set_callback('my_callback');
//当输出时就会引用Callback函数
echo $html;
function my_callback($element) {
????????//隐藏所有的<b>标签
????????if ($element->tag=='b')
????????????????$element->outertext = '';
}?
//用它的函数名注册callback函数
$html->set_callback('my_callback');
//当输出时就会引用Callback函数
echo $html;
作者: S.C. Chen (me578022@gmail.com)
本程序创意来自Jose Solorzano的HTML Parser for PHP 4.?
贡献者: Yousuke Kumakura, Vadim Voituk, Antcs
中文手册翻译:蜗牛?
指正翻译中的错误,以及该程序的讨论地址:蜗牛的牛窝
ComSing 开发者之家