wapplersystems / php-html-parser
一个HTML DOM解析器。它允许您操作HTML。使用选择器在HTML页面上查找标签,就像jQuery一样。
Requires
- php: >=7.3
- ext-curl: *
- ext-mbstring: *
- ext-zlib: *
- 1foru/string-encode: ^2.2
- guzzlehttp/guzzle: ^7.0
- guzzlehttp/psr7: ^2.0
- myclabs/php-enum: ^1.8
- php-http/httplug: ^2.1
- psr/http-client: ^1.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- mockery/mockery: ^1.2
- phan/phan: ^5.2
- phpunit/phpunit: ^8.0 || ^9.0
This package is auto-updated.
Last update: 2024-09-08 17:35:33 UTC
README
PHPHtmlParser是一个简单、灵活的HTML解析器,允许您使用任何CSS选择器选择标签,就像jQuery一样。目标是协助开发需要快速、轻松地抓取HTML的工具,无论其是否有效!
安装
使用composer安装最新版本。
$ composer require wapplersystems/php-html-parser
由于原始创建者似乎已经放弃了这个项目,我无法在我的项目中安装它,所以我创建了一个分支并将其作为一个新的包发布,以便我可以在我的项目中安装它。
基本用法
您可以在测试目录中找到许多如何使用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"
上面的示例将输出 "点击这里"。简单吗?您可以通过DOM获取相同的结果的许多方式,例如 $dom->getElementsbyTag('a')[0]
或 $dom->find('a', 0)
,这些都可以在测试或代码本身中找到。
从经济上支持PHP Html Parser
通过Tidelift订阅获取支持的Monolog并帮助资助项目。
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,这是一个在线的实时页面,并获取所有内容-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
异常。
空白文本节点
空白文本节点(默认为true)选项告诉解析器即使节点内容为空(只有空白)也要保存文本节点。将其设置为false将忽略文档中找到的所有只包含空白的文本节点。
强制编码
强制编码(默认为null)选项将强制使用字符集来读取内容并返回使用该编码的内容。将其设置为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>'