ramphor / php-html-parser
HTML DOM 解析器。它允许你操作 HTML。使用选择器在 HTML 页面上查找标签,就像 jQuery 一样。
Requires
- php: >=7.1
- ext-curl: *
- ext-mbstring: *
- ext-zlib: *
- guzzlehttp/psr7: ^1.6
- myclabs/php-enum: ^1.7
- paquettg/string-encode: ~1.0.0
- php-http/httplug: ^2.1
- ramphor/httplug-guzzle6-adapter: ^2.0.2
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.16
- infection/infection: ^0.13.4
- mockery/mockery: ^1.2
- phan/phan: ^2.4
- php-coveralls/php-coveralls: ^2.1
- phpunit/phpunit: ^7.5.1
This package is auto-updated.
Last update: 2024-09-07 01:55:44 UTC
README
版本 3.0.0
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"
上述代码将输出 "点击这里"。简单吗?从 dome 获取相同结果的方式有很多,例如 $dom->getElementsbyTag('a')[0]
或 $dom->find('a', 0)
,这些都可在测试或代码本身中找到。
加载文件
你也可以无缝地将文件加载到 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 时使用自定义 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,如果它发现 HTML 不严格合规(所有标签都必须有结束标签,没有值的属性等),将抛出 StrickException
。
空白文本节点
whitespaceTextNode,默认为true,该选项告诉解析器即使节点内容为空(仅空白),也要保存文本节点。将其设置为false将忽略文档中找到的所有仅包含空白的文本节点。
enforceEncoding
enforceEncoding,默认为null,该选项将强制使用一个字符集来读取内容,并以该编码返回内容。将其设置为null将触发从给定字符串的内容中尝试确定编码的操作。
cleanupInput
将此设置为false
以跳过解析器的整个清理阶段。如果设置为true,则忽略下一个3个选项。默认为true
。
removeScripts
将此设置为false
以跳过从文档主体中删除脚本标签。这可能会产生不利影响。默认为true
。
removeStyles
将此设置为false
以跳过从文档主体中删除样式标签。这可能会产生不利影响。默认为true
。
preserveLineBreaks
如果设置为true
,则保留换行符。如果设置为false
,则将换行符作为输入清理过程的一部分进行清理。默认为false
。
removeDoubleSpace
如果您想保留文本节点内的空白,请将此设置为false
。默认设置为true
。
removeSmartyScripts
如果您想保留HTML内容中找到的smarty脚本,请将此设置为false
。默认设置为true
。
htmlSpecialCharsDecode
默认设置为false
。将其设置为true
将应用php函数htmlspecialchars_decode
到所有属性值和文本节点。
selfClosing
此选项包含所有自闭合标签的数组。这些标签必须是自闭合的,如果启用了严格模式,解析器将强制它们自闭合。您可以通过使用严格模式时可以用作自闭合标签的任何其他标签来更新此列表。您还可以从该数组中删除标签或完全清空它。
noSlash
此选项包含所有不能自闭合的标签的数组。列表最初为空,但您可以按需添加元素。
静态外观
您还可以为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>'