PHP Simple HTML DOM Parser记录

要求最低限度推荐PHP版本5.6.0最新稳定版本PHP扩展iconviconv,mbstringphp.ini设置—allow_url_fopen = 1 **** 这使得使用URL从URL加载文件成为可能file_get_html快速开始下面的示例代码演示了 PHP Simple HTML DOM Parser 的基本功能。从 HTML 文档中读取纯文本echo file_get_html(‘https://www.google.com/’)->plaintext;将指定的 HTML文档加载到内存中,对其进行解析并返回纯文本。注意file_get_html支持本地文件和远程文件!从 HTML 字符串中读取纯文本echo str_get_html(‘<ul><li>Hello, World!</li></ul>’)->plaintext;解析提供的 HTML字符串并返回纯文本。请注意,解析器处理部分文档以及完整文档。从 HTML 文档中读取特定元素$html = file_get_html(‘https://www.google.com/’);

foreach($html->find(‘img’) as $element)
echo $element->src . ‘<br>';

foreach($html->find(‘a’) as $element)
echo $element->href . ‘<br>';将指定的文档加载到内存中并返回图像源列表以及锚链接。请注意,find 支持CSS选择器以在 DOM 中查找元素。修改 HTML 文档$doc = ‘<div id="hello">Hello, </div><div id="world">World!</div>';

$html = str_get_html($doc);

$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字符串并在返回更新的HTML字符串之前替换DOM中的元素。在本例中,第二个div元素的类设置为bar,第一个div元素的内部文本设置为foo。请注意,find支持第二个参数从匹配数组中返回单个元素。请注意,可以通过魔术方法直接访问属性(->class在->innertext上面的示例中)。从 Slashdot 收集信息$html = file_get_html(‘https://slashdot.org/’);

$articles = $html->find(‘article[data-fhtype="story"]’);

foreach($articles as $article) {
$item[‘title’] = $article->find(‘.story-title’, 0)->plaintext;
$item[‘intro’] = $article->find(‘.p’, 0)->plaintext;
$item[‘details’] = $article->find(‘.details’, 0)->plaintext;
$items[] = $item;
}

print_r($items);从Slashdot收集信息以进行进一步处理。请注意,CSS 选择器和魔术方法的组合使解析 HTML 文档的过程成为一项易于理解的简单任务。创建 HTML DOM 对象面向过程// 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’);面向对象// Create a DOM object
$html = new simple_html_dom();

// Load HTML from a string
$html->load(‘<html><body>Hello!</body></html>’);

// Load HTML from a URL
$html->load_file(‘http://www.google.com/’);

// Load HTML from a HTML file
$html->load_file(‘test.htm’);查找 HTML 元素按标签名称查找元素// Find all anchors, returns a array of element objects
$ret = $html->find(‘a’);

// Find all anchors and images, returns an array of element objects
$ret = $html->find(‘a, img’);

// Find (N)th anchor, returns element object or null if not found (zero based)
$ret = $html->find(‘a’, 0);

// Find last anchor, returns element object or null if not found (zero based)
$ret = $html->find(‘a’, -1);按类名或 id 查找元素// Find all element which id=foo
$ret = $html->find(‘#foo’);

// Find all element which class=foo
$ret = $html->find(‘.foo’);按属性查找元素// Find all <div> with the id attribute
$ret = $html->find(‘div[id]’);

// Find all <div> which attribute id=foo
$ret = $html->find(‘div[id=foo]’);

// Find all anchors and images with the "title" attribute
$ret = $html->find(‘a[title], img[title]’);

// Find all element has attribute id
$ret = $html->find(‘*[id]’);属性过滤器 在属性选择器中支持这些运算符:筛选描述[attribute]匹配具有 指定属性的元素。[!attribute]匹配没有 指定属性的元素。[attribute=value]匹配具有 特定值 的指定属性的元素。[attribute!=value]将不具有 指定属性的元素与特定值匹配。[attribute^=value]匹配具有指定属性并以特定值 开头的元素 。[attribute$=value]匹配具有指定属性并以特定值 结尾的元素 。[attribute*=value]匹配具有指定属性且 包含 特定值的元素。查找子体// Find all <li> in <ul>
$es = $html->find(‘ul li’);

// Find Nested <div> tags
$es = $html->find(‘div div div’);

// Find all <td> in <table> which class=hello
$es = $html->find(‘table.hello td’);

// Find all td tags with attribite align=center in table tags
$es = $html->find(‘table td[align=center]’);查找嵌套元素// Find all <li> in <ul>
foreach($html->find(‘ul’) as $ul)
{
foreach($ul->find(‘li’) as $li)
{
// do something…
}
}

// Find first <li> in first <ul>
$e = $html->find(‘ul’, 0)->find(‘li’, 0);查找文本块和评论// Find all text blocks
$es = $html->find(‘text’);

// Find all comment (<!–…–>) blocks
$es = $html->find(‘comment’);访问 HTML 元素属性获取、设置和删除属性// Get a attribute ( If the attribute is non-value attribute (eg. checked, selected…), it will returns true or false)
$value = $e->href;

// Set a attribute(If the attribute is non-value attribute (eg. checked, selected…), set it’s value as true or false)
$e->href = ‘my link';

// Remove a attribute, set it’s value as null!
$e->href = null;

// Determine whether a attribute exist?
if(isset($e->href))
echo ‘href exist!';魔法属性// Example
$html = str_get_html("<div>foo <b>bar</b></div>");
$e = $html->find("div", 0);

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"属性名称描述$e->tag读取或写入元素的 标签名称 。$e->outertext读取或写入元素的 外部HTML文本 。$e->innertext读取或写入元素的 内部HTML文本 。$e->plaintext读取或写入元素的 纯文本 。提示// 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;遍历 DOM 树如果您对 HTML DOM 不太熟悉,请查看此 链接 以了解更多信息…// 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’);您还可以使用 Camel命名约定 (机翻)调用方法。方法描述$e->children( [int $index] ) : mixed如果设置了索引,则返回第 N个子对象,否则返回子数组。$e->parent() : element返回元素的父元素。$e->first_child() : element返回元素的第一个子元素,如果未找到则返回null 。$e->last_child() : element返回元素的最后一个子元素,如果未找到则返回null 。$e->next_sibling() : element返回元素的下一个兄弟元素,如果未找到则返回null 。$e->prev_sibling() : element返回元素的前一个兄弟元素,如果未找到则返回null 。保存 DOM 对象面向过程// 将内部DOM树转储回字符串
$str = $html;

// 打印
echo $html;面向对象// 将内部DOM树转储回字符串
$str = $html->save();

// 将内部DOM树转储回文件
$html->save(‘result.htm’);自定义解析行为// Write a function with parameter "$element"
//使用参数“$element”编写函数
function my_callback($element) {
// Hide all <b> tags
if ($element->tag==’b’)
$element->outertext = ”;
}

// Register the callback function with it’s function name
//用其函数名注册回调函数
$html->set_callback(‘my_callback’);

// Callback function will be invoked while dumping
//转储时将调用回调函数
echo $html;向 DOM 添加节点解析器允许您向现有文档添加新元素。在下面找到一个例子。备注无法通过 ->outertext 、 ->innertext 或 ->plaintext 创建节点。这些属性只更改节点的文本表示形式,如果使用不当,将返回不希望的结果。使用 $html->createElement 和 $html->createTextNode 创建新节点。使用 $node->appendChild 将一个节点作为子节点添加到另一个节点。节点可以以任何顺序组合。例子<?php

// This example illustrates adding new elements to the DOM.

require_once ‘simple_html_dom.php';

/***************************** table data *************************************/

$header = array(‘Ocean’, ‘Volume (km^3)’);

$data = array(
array(‘Arctic Ocean’, 18750000),
array(‘Atlantic Ocean’, 310410900),
array(‘Indian Ocean’, 264000000),
array(‘Pacific Ocean’, 660000000),
array(‘Souce China Sea’, 9880000),
array(‘Southern Ocean’, 71800000)
);

/***************************** template ***************************************/

$doc = <<<EOD
<html>
<head>
<style>
table { border: 1px solid black; }

tr:nth-child(even) { background: #CCC }
tr:nth-child(odd) { background: #FFF }
</style>
</head>
<body>
<h1>Volumes of the World’s Oceans</h1>
</body>
</html>
EOD;

/***************************** code *******************************************/

$html = str_get_html($doc);
$body = $html->find(‘body’, 0);
$table = $html->createElement(‘table’);

// Header row
$tr = $html->createElement(‘tr’);
foreach ($header as $entry) {
$th = $html->createElement(‘th’, $entry);
$tr->appendChild($th);
}
$table->appendChild($tr);

// Table data
foreach ($data as $row) {
$tr = $html->createElement(‘tr’);
foreach ($row as $entry) {

// (optional) Add info to the volume column
if (is_numeric($entry)) {
$value = number_format($entry);
$td = $html->createElement(‘td’, $value);
$td->setAttribute(‘volume’, $entry);
} else {
$td = $html->createElement(‘td’, $entry);
}

$tr->appendChild($td);
}
$table->appendChild($tr);
}

$body->appendChild($table);

echo $html . PHP_EOL;

/**
* Output (beautified)
*
* <html>
* <head>
* <style>
* table { border: 1px solid black; }
* tr:nth-child(even) { background: #CCC }
* tr:nth-child(odd) { background: #FFF }
* </style>
* </head>
* <body>
* <h1>Volumes of the World’s Oceans</h1>
* <table>
* <tr><th>Ocean</th><th>Volume (km^3)</th></tr>
* <tr><td>Arctic Ocean</td><td volume="18750000">18,750,000</td></tr>
* <tr><td>Atlantic Ocean</td><td volume="310410900">310,410,900</td></tr>
* <tr><td>Indian Ocean</td><td volume="264000000">264,000,000</td></tr>
* <tr><td>Pacific Ocean</td><td volume="660000000">660,000,000</td></tr>
* <tr><td>Souce China Sea</td><td volume="9880000">9,880,000</td></tr>
* <tr><td>Southern Ocean</td><td volume="71800000">71,800,000</td></tr>
* </table>
* </body>
* </html>
*/API 参考解析文档 解析器接受 URL、文件和字符串形式的文档。该文档必须可供阅读,并且不能超过MAX_FILE_SIZE.名称描述str_get_html( string $content ) : object从字符串创建一个 DOM 对象。file_get_html( string $filename ) : object从文件或 URL 创建一个 DOM 对象。DOM 方法和属性姓名描述__construct( [string $filename] ) : void构造函数,设置文件名参数将自动加载内容,文本或文件/url。plaintext : string返回从 HTML 中提取的内容。clear() : void清理内存。load( string $content ) : void从字符串加载内容。save( [string $filename] ) : string将内部 DOM 树转储回字符串。如果设置了 $filename,结果字符串将保存到文件中。load_file( string $filename ) : void从文件或 URL 加载内容。set_callback( string $function_name ) : void设置回调函数。find( string $selector [, int $index] ) : mixed通过 CSS 选择器查找元素。如果设置了索引,则返回第 N 个元素对象,否则返回对象数组。元素方法和属性姓名描述[attribute] : string读取或写入元素的属性值。tag : string读取或写入元素的标签名称。outertext : string读取或写入元素的外部 HTML 文本。innertext : string读取或写入元素的内部 HTML 文本。plaintext : string读取或写入元素的纯文本。find( string $selector [, int $index] ) : mixed通过 CSS 选择器查找子级。如果设置了索引,则返回第 N 个元素对象,否则返回对象数组。DOM 遍历姓名描述$e->children( [int $index] ) : mixed如果设置了索引,则返回第 N 个子对象,否则返回子对象数组。$e->parent() : element返回元素的父元素。`$e->first_child() : element返回元素的第一个子元素,如果未找到则返回 null。$e->last_child() : element返回元素的最后一个子元素,如果未找到则返回 null。$e->next_sibling() : element返回元素的下一个兄弟元素,如果未找到则返回 null。$e->prev_sibling() : element返回元素的前一个兄弟元素,如果未找到则返回 null。骆驼命名约定 (机翻)方法映射$e->getAllAttributes()$e->attr$e->getAttribute( $name )$e->attribute$e->setAttribute( $name, $value)$value = $e->attribute$e->hasAttribute( $name )isset($e->attribute)$e->removeAttribute ( $name )$e->attribute = null$e->getElementById ( $id )$e->find ( "#$id", 0 )$e->getElementsById ( $id [,$index] )$e->find ( "#$id" [, int $index] )$e->getElementByTagName ($name )$e->find ( $name, 0 )$e->getElementsByTagName ( $name [, $index] )$e->find ( $name [, int $index] )$e->parentNode ()$e->parent ()$e->childNodes ( [$index] )$e->children ( [int $index] )$e->firstChild ()$e->first_child ()$e->lastChild ()$e->last_child ()$e->nextSibling ()$e->next_sibling ()$e->previousSibling ()$e->prev_sibling ()常量常量定义解析器如何处理文档。可以在加载解析器之前定义它们以全局替换默认值。DEFAULT_TARGET_CHARSET 定义解析器返回的文本的默认目标字符集。默认:’UTF-8’DEFAULT_BR_TEXT <br>定义要为元素返回的默认文本。默认:"\r\n"DEFAULT_SPAN_TEXT <span>定义要为元素返回的默认文本。默认:’ ‘MAX_FILE_SIZE 定义解析器可以加载到内存中的最大字节数。此限制仅适用于源文件或字符串。默认:600000定义下面的定义是解析器的重要组成部分。节点类型 节点的类型在解析期间确定,并由下面列表中的元素之一表示。类型描述HDOM_TYPE_ELEMENT开始标签(即<html>)HDOM_TYPE_COMMENTHTML 注释(即<!– Hello, World! –>)HDOM_TYPE_TEXT纯文本(即Hello, World!)HDOM_TYPE_ENDTAG结束标签(即</html>)HDOM_TYPE_ROOT根元素。DOM 中始终只能有一个根元素。HDOM_TYPE_UNKNOWN未知类型(即 CDATA、DOCTYPE 等…)例子<!DOCTYPE html><html><!– Hello, World! –></html>Hello, World!注意: HDOM_TYPE_ROOT无论实际文档结构如何,始终存在。HTML节点类型 HDOM_TYPE_ROOT<!DOCTYPE html>HDOM_TYPE_UNKNOWN<html>HDOM_TYPE_ELEMENT<!– Hello, World! –>HDOM_TYPE_COMMENT</html>HDOM_TYPE_ENDTAGHello, World!HDOM_TYPE_TEXT报价单类型 标识属性值的引用类型。类型描述HDOM_QUOTE_DOUBLE双引号 ( "")HDOM_QUOTE_SINGLE单引号 ( ”)HDOM_QUOTE_NO未引用(标志)注意: 没有值(标志)的属性存储为HDOM_QUOTE_NO.例子<p class="paragraph" id=’info1′ hidden>Hello, World!</p>属性描述class="paragraph"HDOM_QUOTE_DOUBLEid=’info1’HDOM_QUOTE_SINGLEhiddenHDOM_QUOTE_NO节点信息类型 每个节点存储由以下元素标识的附加信息(元数据)。类型描述HDOM_INFO_BEGIN节点开始标记的光标位置。HDOM_INFO_END节点结束标记的光标位置。零值表示没有结束标记的节点(缺少结束标记)。HDOM_INFO_QUOTE属性值的引用类型。该值必须是Quote Type的元素。HDOM_INFO_SPACE属性周围的空白数组(请参阅Attribute Whitespace)。HDOM_INFO_TEXT标签中的非 HTML 文本(即评论、文档类型等)。HDOM_INFO_INNER节点的内部文本。HDOM_INFO_OUTER节点的外部文本。HDOM_INFO_ENDSPACE结束括号前标签末尾的空格。属性空白 属性周围的空格以包含三个元素的数组的形式存储:元素描述0属性名称前的空格。1属性名称和等号之间的空格。2等号和属性值之间的空格例子<p class="paragraph" id = ‘info1’hidden>Hello, World!</p>注意: 属性名称前的空格不会显示在浏览器中。然而,它是属性的一部分。属性描述class="paragraph"[0] => ‘ ‘, [1] => ”, [2] => ”id = ‘info1′[0] => ‘ ‘, [1] => ‘ ‘, [2] => ‘ ‘hidden[0] => ”, [1] => ”, [2] => ”str_get_htmlstr_get_html ( string $str [, bool $lowercase = true [, bool $forceTagsClosed = true [, string $target_charset = DEFAULT_TARGET_CHARSET [, bool $stripRN = true [, string $defaultBRText = DEFAULT_BR_TEXT [, string $defaultSpanText = DEFAULT_SPAN_TEXT ]]]]]] )解析提供的字符串并返回 DOM 对象。范围描述strHTML 文档字符串。lowercase如果启用,则强制标记小写匹配。这在加载具有混合命名约定的文档时非常有用。forceTagsClosed过时的。解析器不再使用此参数。target_charset从文档返回文本时定义目标字符集。stripRN如果启用,则在解析文档之前删除换行符。defaultBRText定义要为元素返回的默认文本。defaultSpanText定义要为元素返回的默认文本。file_get_htmlfile_get_html ( string $url [, bool $use_include_path = false [, resouce $context = null [, int $offset = 0 [, int $maxLen = -1 [, bool $lowercase = true [, bool $forceTagsClosed = true [, string $target_charset = DEFAULT_TARGET_CHARSET [, bool $stripRN = true [, string $defaultBRText = DEFAULT_BR_TEXT [, string $defaultSpanText = DEFAULT_SPAN_TEXT ]]]]]]]]]] )解析提供的文件并返回 DOM 对象。范围描述url要读取的文件的名称或 URL。use_include_path看file_get_contentscontext看file_get_contentsoffset看file_get_contentsmaxLen看file_get_contentslowercase如果启用,则强制标记小写匹配。这在加载具有混合命名约定的文档时非常有用。forceTagsClosed过时的。解析器不再使用此参数。target_charset从文档返回文本时定义目标字符集。stripRN如果启用,则在解析文档之前删除换行符。defaultBRText定义要为元素返回的默认文本。defaultSpanText定义要为元素返回的默认文本。


本文出自快速备案,转载时请注明出处及相应链接。

本文永久链接: https://www.xiaosb.com/beian/53394/