要求 最低限度 推荐
PHP版本 5.6.0 最新稳定版本
PHP扩展 iconv iconv,mbstring
php.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_COMMENT HTML 注释(即<!-- 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_ENDTAG
Hello, 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_DOUBLE
id='info1' HDOM_QUOTE_SINGLE
hidden HDOM_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_html

str_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 对象。

范围 描述
str HTML 文档字符串。
lowercase 如果启用,则强制标记小写匹配。这在加载具有混合命名约定的文档时非常有用。
forceTagsClosed 过时的。解析器不再使用此参数。
target_charset 从文档返回文本时定义目标字符集。
stripRN 如果启用,则在解析文档之前删除换行符。
defaultBRText 定义要为元素返回的默认文本。
defaultSpanText 定义要为元素返回的默认文本。

file_get_html

file_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_contents
context 看file_get_contents
offset 看file_get_contents
maxLen 看file_get_contents
lowercase 如果启用,则强制标记小写匹配。这在加载具有混合命名约定的文档时非常有用。
forceTagsClosed 过时的。解析器不再使用此参数。
target_charset 从文档返回文本时定义目标字符集。
stripRN 如果启用,则在解析文档之前删除换行符。
defaultBRText 定义要为元素返回的默认文本。
defaultSpanText 定义要为元素返回的默认文本。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。