jerodev / diggy
流畅的PHP网络爬虫
2.1
2024-06-07 19:50 UTC
Requires
- php: ^8.1
- ext-dom: *
- guzzlehttp/guzzle: ^7.0
- symfony/css-selector: ^6.1
Requires (Dev)
- jerodev/code-styles: dev-master
- phpstan/phpstan: ^1.0
- phpunit/phpunit: ^9.3
README
Diggy是PHP DOM扩展的简单包装,允许使用简单的查询选择器查找元素并实现无故障的链式调用。
要求
- PHP 8.1
入门
Diggy包含一个简单的web客户端,底层使用Guzzle下载页面并返回一个NodeCollection
对象。然而,您可以使用任何您喜欢的web客户端,并将一个DOMNode
或DOMNodeList
对象传递给NodeCollection
构造函数。
$client = new \Jerodev\Diggy\WebClient(); $page = $client->get('https://www.deviaene.eu/'); $socials = $page->first('#social')->querySelector('a span')->texts(); var_dump($socials); // [ // 'GitHub', // 'Twitter', // 'Email', // 'LinkedIn', // ]
可用函数
这是NodeCollection
对象上的可用函数。所有不返回原生值的函数都可以进行链式调用,无需担心集合中是否有节点。
attribute(string $name)
如果可用,返回集合中第一个元素的属性值。
$nodes->attribute('href');
count()
返回当前节点集合中元素的数量。
$nodes->count();
each(string $selector, closure $closure, ?int $max = null)
遍历当前集合中的所有DOM元素并执行闭包。此函数的返回值是闭包返回值的数组。
$nodes->each('a', static function (NodeFilter $node) { return $a->attribute('href'); });
exists(?string $selector = null)
指示集合中是否存在元素。如果提供了选择器,将首先过滤当前节点。
$nodes->exists('a.active');
filter(closure $closure)
根据给定的闭包过滤当前节点集合。
$nodes->filter(static function (NodeFilter $node) { return $node->text() === 'foo'; });
first(?string $selector = null)
返回节点集合的第一个元素。如果提供了选择器,将首先过滤当前节点。
$nodes->first('a.active');
is(string $nodeName)
指示当前集合中的第一个元素是否具有指定的标签名。
$nodes->is('div');
last(?string $selector = null)
返回节点集合的最后一个元素。如果提供了选择器,将首先过滤当前节点。
$nodes->last('a.active');
nodeName()
返回当前节点集合中第一个元素的标签名。
$nodes->nodeName();
nth(int $index, ?string $selector = null)
返回节点集合中的第n个元素,从0
开始。如果提供了选择器,将首先过滤当前节点。
$nodes->nth(1, 'a.active');
querySelector(string $selector)
在当前节点集合中查找匹配此CSS查询选择器的所有元素。
$nodes->querySelector('a.active');
text(?string $selector = null)
返回节点集合中第一个元素的内部文本。如果提供了选择器,将首先过滤当前节点。
$nodes->text('p.description');
texts()
返回包含集合中每个根元素内部文本的数组。
$nodes->texts('nav > a');
whereHas(closure $closure)
过滤包含满足闭包描述的过滤器的子节点的节点。
$nodes->whereHas(static function (NodeFilter $node) { return $node->first('a[href]'); });
whereHasAttribute(string $key, ?string $value = null)
根据特定属性的存在过滤当前节点集合。如果提供了值,集合也将根据此属性值进行过滤。
$nodes->whereHasAttribute('href');
whereHasText(?string $value = null, bool $trim = true, bool $exact = false)
根据内部文本的存在过滤当前节点集合。设置值将根据$trim
和$exact
过滤节点。
$nodes->whereHasText('foo');
xPath(string $selector)
查找当前节点集合中所有匹配此xpath查询选择器的元素。
$nodes->xPath('//nav/a[@href]');