jerodev/diggy

流畅的PHP网络爬虫

2.1 2024-06-07 19:50 UTC

This package is auto-updated.

Last update: 2024-09-07 20:19:15 UTC


README

PHP tests Latest Stable Version

Diggy是PHP DOM扩展的简单包装,允许使用简单的查询选择器查找元素并实现无故障的链式调用。

要求

  • PHP 8.1

入门

Diggy包含一个简单的web客户端,底层使用Guzzle下载页面并返回一个NodeCollection对象。然而,您可以使用任何您喜欢的web客户端,并将一个DOMNodeDOMNodeList对象传递给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]');