提取数据

通过上一个章节,我们已经可以通过请求到网页的html数据。

下一步我们需要从html中提取出我们想要的信息。

传统的提取(匹配)数据的方式,是用正则表达式。但这有一个缺陷是比较复杂、可读性很差。

这里我们提供更方便的方式: 通过css选择器(或xpath)来匹配数据。

注: XCrawler的Dom解析组件基于symfony的DomCrawler。

所以完整使用文档你可以参考: DomCrawler组件

用法

使用css选择器来解析内容

<?php
use Symfony\Component\DomCrawler\Crawler;

$html = <<<'HTML'
<!DOCTYPE html>
<html>
    <body>
        <p class="message" id='message-id'>Hello World!</p>
        <p>Hello Crawler!</p>
    </body>
</html>
HTML;

$crawler = new Crawler();
$crawler->addHtmlContent($html);

// 获取.message中的html内容
$message = $crawler->filter('.message')->html();
var_dump($message);
// Hello World!

// 获取.message中的属性信息
$message_id = $crawler->filter('.message')->attr('id');
var_dump($message_id);
// message-id

// 遍历所有的p标签
$list = $crawler->filter('body p')->each(function(Crawler $node, $i) {
    return $node->html();
});
var_dump($list);
// array(2) {
//   [0] =>
//   string(12) "Hello World!"
//   [1] =>
//   string(14) "Hello Crawler!"
// }

使用xpath来解析内容

$crawler->filterXPath('//body/p[1]')->html();

辅助函数

在真实环境中,由于symfony的dom-crawler解析不到内容,会抛出异常。($crawler->filter('.selector')->each()方法不会抛出异常)

但有时我们并不想让它抛出异常,因为它会让整个爬虫挂掉。

所以这里我们提供了辅助函数: dom-crawler()。使用该函数解析dom时,如果该节点不存在,则不会抛出异常,而是返回NULL。

使用方法

$crawler = new Crawler();
$crawler->addHtmlContent($html);

// css选择器解析数据
dom_filter($crawler, '.message', 'html');
dom_filter($crawler, '.message', 'attr', 'id');
// xpath解析数据
dom_filter_xpath($crawler, '//body/p[1]', 'html');