ppajer/domextractor

轻松从HTML和XML DOM文档中提取数据。使网页抓取变得更加整洁

dev-master 2020-08-05 13:43 UTC

This package is auto-updated.

Last update: 2024-09-05 22:47:37 UTC


README

A PHP库,用于根据自定义提取规则将HTML DOM文档中的数据提取到任何用户定义的数据结构中。

用法

安装

下载仓库并通过Composer安装,或者手动下载并将类包含到项目中。注意:此包需要ivopetkov/html5-dom-document-php来处理HTML5文档。如果您手动安装,您将需要自己管理此依赖项。

定义提取规则

规则是简单的PHP数组,表示提取器必须查找值的位置。它们由一个用于存储输出的和一个用于匹配所需元素的CSS 选择器组成。默认情况下,将返回元素的文本值,除非您指定要返回的属性。所有提取器的指令键都以一个@为前缀,在输出中将被忽略。

基本查询和属性

该包使用CSS选择器语法从文档节点中获取值,包括文本和属性节点。最基本的规则可以写成

array(
	'exampleKey' => array(
		'@selector' => 'title'
	)
)

// Will return:

array(
	'exampleKey' => 'Example Title'
)

如果您要查找的数据在元素属性中,请在选择器中使用@符号指定它。

array(
	'exampleKey' => array(
		'@selector' => 'h1@class'
	)
)

// Will return: 

array(
	'exampleKey' => 'h1 green-text site-heading'
)

列表和嵌套数据

如果您需要为单个键解析多个值,或查找嵌套数据,可以使用@each指令,并嵌套尽可能多的指令级别,这取决于您的内存限制。

array(
	'exampleKey' => array(
		'@selector' => '.some-list-item',
		'@each' => array(
			'listItemTitle' => array(
					'@selector' => 'h3'
			),
			'listItemLink' => array(
					'@selector' => 'a@href'
			),
			'listItemImages' => array(
					'@selector' => '.carousel-item',
					'@each' => array(
						'src' => array(
							'@selector' => 'img@src'
						)
					)
			)
		)
	)
)

这将返回一个数组,其中exampleKey是一个包含有关列表中每个项目数据的数组:在这个例子中,每个h3标签的文本内容、每个a元素的href属性以及每个img元素的src属性。

array(
	'exampleKey' => array(
		array(
			'listItemTitle' => 'Some title',
			'listItemLink' => 'https://...',
			'listItemImages' => array(
				array('src' => 'https://...'),
				array('src' => 'https://...'),
				...
			)
		),
		array(
			'listItemTitle' => 'Some other title',
			'listItemLink' => 'https://...',
			'listItemImages' => array(
				array('src' => 'https://...'),
				array('src' => 'https://...'),
				...
			)
		),
		...
	)
)

设置规则

一旦您的规则准备就绪,您可以通过调用setRules将它们传递给实例,或者作为构造函数的第一个参数。为了方便,提取器也可以接受其指令作为JSON字符串或来自外部JSON文件的路由。

$rules = /* array or JSON string or file path */;

// Constructor 
$extractor = new DOM_Extractor($rules);

// OR Instance
$extractor = new DOM_Extractor();
$extractor->setRules($rules);

加载文档

一旦一切设置完毕,您就可以加载文档以进行解析和提取。与传递规则一样,这里也有使用构造函数的第二个参数或专用load方法的选择。

$html = file_get_contents('https://...');

// Constructor 
$extractor = new DOM_Extractor($rules, $html);

// OR Instance
$extractor = new DOM_Extractor();
$extractor->load($html);

完整示例

$rules = 'some/path/to/rules.json';
$html = file_get_contents('https:/...');

// Constructor method
$extractor = new DOM_Extractor($rules, $html);
$data = $extractor->parse();

// Instance method
$extractor = new DOM_Extractor;
$extractor->setRules($rules);
$extractor->load($html);
$data = $extractor->parse();

// Also supports method chaining:
$extractor = new DOM_Extractor
$data = $extractor->setRules($rules)->load($html)->parse();
˙``