hjbdev/php-html-parser

HTML DOM 解析器。它允许您操作 HTML。使用选择器在 HTML 页面上查找标签,就像 jQuery 一样。

资助包维护!
Tidelift

安装: 45

依赖: 0

建议: 0

安全: 0

星标: 0

关注者: 1

分支: 460

语言:HTML

3.1.1 2020-10-22 14:17 UTC

README

版本 3.1.1

此分支

此分支旨在支持旧版本的 Guzzle,使您能够使用此包与 Laravel 一起使用。

Build Status Coverage Status Scrutinizer Code Quality

PHPHtmlParser 是一个简单、灵活的 HTML 解析器,它允许您使用任何 CSS 选择器选择标签,就像 jQuery 一样。目标是帮助开发需要快速、简便地抓取 HTML 的工具,无论其是否有效!

安装

使用 composer 安装最新版本。

$ composer require paquettg/php-html-parser

此包可在 packagist 上找到,并且最好使用 composer 加载。我们支持 php 7.2、7.3 和 7.4。

基本用法

您可以在测试目录中找到许多使用 DOM 解析器和其任何部分(您最可能永远不会接触)的示例。这些测试使用 PHPUnit 进行,非常小,每个只有几行,是一个很好的起点。考虑到这一点,我仍将展示一些如何使用此包的示例。以下是一个使用此包的非常简单的示例。

// Assuming you installed from Composer:
require "vendor/autoload.php";
use PHPHtmlParser\Dom;

$dom = new Dom;
$dom->loadStr('<div class="all"><p>Hey bro, <a href="google.com">click here</a><br /> :)</p></div>');
$a = $dom->find('a')[0];
echo $a->text; // "click here"

上面的代码将输出 "click here"。简单吗?从 DOM 中获取相同结果的方法有很多,例如 $dom->getElementsbyTag('a')[0]$dom->find('a', 0),这些都可在测试或代码本身中找到。

财务支持 PHP Html Parser

通过 Tidelift 订阅 获取支持,并帮助资助项目。

Tidelift 为您构建应用程序时使用的开源依赖项提供商业支持和维护。节省时间,降低风险,并提高代码质量,同时支付您使用的确切依赖项的维护者。

加载文件

您还可以无缝地将文件加载到 DOM 中,而不是字符串,这更加方便,也是大多数开发者加载 HTML 的方式。以下示例取自我们的测试,并使用了那里找到的 "big.html" 文件。

// Assuming you installed from Composer:
require "vendor/autoload.php";
use PHPHtmlParser\Dom;

$dom = new Dom;
$dom->loadFromFile('tests/data/big.html');
$contents = $dom->find('.content-border');
echo count($contents); // 10

foreach ($contents as $content)
{
	// get the class attr
	$class = $content->getAttribute('class');
	
	// do something with the html
	$html = $content->innerHtml;

	// or refine the find some more
	$child   = $content->firstChild();
	$sibling = $child->nextSibling();
}

此示例加载了来自 big.html 的 HTML,这是一个在网络上找到的页面,并获取所有 content-border 类进行处理。它还展示了您可以对一个节点执行的一些操作,但这并不是节点可用的方法列表的详尽清单。

加载 URL

加载 URL 与从文件加载 HTML 的方式非常相似。

// Assuming you installed from Composer:
require "vendor/autoload.php";
use PHPHtmlParser\Dom;

$dom = new Dom;
$dom->loadFromUrl('http://google.com');
$html = $dom->outerHtml;

// or
$dom->loadFromUrl('http://google.com');
$html = $dom->outerHtml; // same result as the first example

默认情况下,loadFromUrl 将使用 \Psr\Http\Client\ClientInterface 的实现来执行 HTTP 请求,并使用 \Psr\Http\Message\RequestInterface 的默认实现来创建请求体。您可以使用 loadFromUrl 容易地实现自己的客户端或请求版本,以在加载 URL 时使用自定义的 HTTP 连接。

// Assuming you installed from Composer:
require "vendor/autoload.php";
use PHPHtmlParser\Dom;
use App\Services\MyClient;

$dom = new Dom;
$dom->loadFromUrl('http://google.com', null, new MyClient());
$html = $dom->outerHtml;

只要客户端对象正确实现了接口,它就会使用该对象来获取 URL 的内容。

加载字符串

直接加载字符串也很容易完成。

// Assuming you installed from Composer:
require "vendor/autoload.php";
use PHPHtmlParser\Dom;

$dom = new Dom;
$dom->loadStr('<html>String</html>');
$html = $dom->outerHtml;

选项

您还可以设置解析选项,这将影响解析引擎的行为。您可以使用Dom对象中的setOptions方法设置全局选项数组,或者通过将选项作为(可选的)额外参数添加到load方法中,为特定实例设置选项。

// Assuming you installed from Composer:
require "vendor/autoload.php";
use PHPHtmlParser\Dom;
use PHPHtmlParser\Options;

$dom = new Dom;
$dom->setOptions(
    // this is set as the global option level.
    (new Options())
        ->setStrict(true)
);

$dom->loadFromUrl('http://google.com', 
    (new Options())->setWhitespaceTextNode(false) // only applies to this load.
);

$dom->loadFromUrl('http://gmail.com'); // will not have whitespaceTextNode set to false.

目前我们支持12个选项。

严格

默认为false的严格(Strict)选项会在发现HTML不符合严格规范(所有标签必须有闭合标签,没有不带值的属性等)时抛出StrickException异常。

空白文本节点

默认为true的空白文本节点(whitespaceTextNode)选项会告诉解析器保存文本节点,即使节点的内容为空(只有空白)。将其设置为false将忽略文档中找到的所有仅包含空白的文本节点。

强制编码

默认为null的强制编码(enforceEncoding)选项将强制使用字符集来读取内容,并以该编码返回内容。将其设置为null将触发尝试从字符串内容中确定编码。

清理输入

将此设置为false以跳过解析器的整个清理阶段。如果设置为true,则忽略下一个3个选项。默认为true

移除脚本

将此设置为false以跳过从文档主体中移除脚本标签。这可能会产生不良影响。默认为true

移除样式

将此设置为false以跳过从文档主体中移除样式标签。这可能会产生不良影响。默认为true

保留换行符

如果设置为true,将保留换行符。如果设置为false,则将作为输入清理过程的一部分清理换行符。默认为false

移除双空格

如果想要保留文本节点中的空白,请将此设置为false。默认为true

移除Smarty脚本

如果想要保留HTML内容中找到的Smarty脚本,请将此设置为false。默认为true

HTML特殊字符解码

默认设置为false。将其设置为true将应用PHP函数htmlspecialchars_decode到所有属性值和文本节点。

自闭合

此选项包含所有自闭合标签的数组。这些标签必须是自闭合的,并且如果启用了严格模式,解析器将强制它们自闭合。您可以通过使用严格模式时添加任何其他可以作为自闭合标签使用的标签来更新此列表。您还可以从数组中删除标签或完全清空它。

不带斜杠

此选项包含所有不能自闭合的标签的数组。列表最初为空,但您可以根据需要添加元素。

静态外观

您还可以为Dom对象挂载静态外观。

PHPHtmlParser\StaticDom::mount();

Dom::loadFromFile('tests/big.hmtl');
$objects = Dom::find('.content-border');

上述PHP代码块执行与第一个示例相同的查找和加载操作,但它使用的是静态外观,该外观支持Dom对象中找到的所有公共方法。

修改Dom

您可以始终修改由任何加载方法创建的dom。要更改任何节点的属性,只需调用setAttribute方法。

use PHPHtmlParser\Dom;

$dom = new Dom;
$dom->loadStr('<div class="all"><p>Hey bro, <a href="google.com">click here</a><br /> :)</p></div>');
$a = $dom->find('a')[0];
$a->setAttribute('class', 'foo');
echo $a->getAttribute('class'); // "foo"

您也可以直接获取PHPHtmlParser\Dom\Tag类,并根据您的需要进行操作。

use PHPHtmlParser\Dom;

$dom = new Dom;
$dom->loadStr('<div class="all"><p>Hey bro, <a href="google.com">click here</a><br /> :)</p></div>');
/** @var Dom\Node\AbstractNode $a */
$a   = $dom->find('a')[0];
$tag = $a->getTag();
$tag->setAttribute('class', 'foo');
echo $a->getAttribute('class'); // "foo"

还可以从树中删除节点。只需在任何节点上调用delete方法即可将其从树中删除。需要注意的是,在从`DOM`中删除节点后,应取消设置节点,否则它仍然会占用内存,直到取消设置。

use PHPHtmlParser\Dom;

$dom = new Dom;
$dom->loadStr('<div class="all"><p>Hey bro, <a href="google.com">click here</a><br /> :)</p></div>');
/** @var Dom\Node\AbstractNode $a */
$a   = $dom->find('a')[0];
$a->delete();
unset($a);
echo $dom; // '<div class="all"><p>Hey bro, <br /> :)</p></div>');

您可以轻松修改 TextNode 对象的文本。请注意,如果您设置了编码,新文本将使用现有的编码进行编码。

use PHPHtmlParser\Dom;

$dom = new Dom;
$dom->loadStr('<div class="all"><p>Hey bro, <a href="google.com">click here</a><br /> :)</p></div>');
/** @var Dom\Node\InnerNode $a */
$a   = $dom->find('a')[0];
$a->firstChild()->setText('biz baz');
echo $dom; // '<div class="all"><p>Hey bro, <a href="google.com">biz baz</a><br /> :)</p></div>'