xparse/parser

解析器客户端

2.0.0 2024-01-11 11:15 UTC

README

GitHub tag Software License Build Status Coverage Status Quality Score Total Downloads

解析器客户端

安装

通过 Composer

$ composer require xparse/parser

用法

  $parser = new \Xparse\Parser\Parser();
  $title = $parser->get('http://funivan.com')->content('//*[@class="entry-title"]/a');
  print_r($title);

使用自定义中间件

如果你使用自定义 Guzzle 中间件并且它不发送真实请求,为了获取最后一个有效的 URL,你需要手动将其设置为响应头 X-GUZZLE-EFFECTIVE-URL

以下是你自定义中间件中的 __invoke() 方法的示例

  public function __invoke(callable $handler) : \Closure {
    return function (RequestInterface $request, array $options) use ($handler) {

      # some code

      return $handler($request, $options)->then(function (ResponseInterface $response) use ($request) {

        $response = $response->withHeader('X-GUZZLE-EFFECTIVE-URL', $request->getUri());
        
        # some code

        return $response;
      });
    };
  }

递归解析器

递归解析器允许你递归地解析网站页面。你需要传递起始链接并设置下一页表达式(XPath、css 等)。

基本用法

尝试找到所有指向 GitHub 仓库的链接。我们的查询将是 xparse。通过递归分页,我们可以遍历所有分页链接并处理每个结果页面以获取仓库链接。

  use Xparse\Parser\Parser;
  use Xparse\Parser\RecursiveParser;
  
  # init Parser
  $parser = new Parser();

  # set expression to pagination links and initial page url
  $pages = new RecursiveParser(
       $parser,
       ["//*[@class='pagination']//a/@href"],
       ['https://github.com/search?q=xparse']
  );

  $allLinks = [];
  foreach($pages as $page){
    # set expression to fetch repository links
    $adsList = $page->value("//*[@class='repo-list-name']//a/@href")->all();
    # merge and remove duplicates
    $allLinks = array_values(array_unique(array_merge($allLinks, $adsList)));
  }
  print_r($allLinks);

测试

    ./vendor/bin/phpunit

贡献

请参阅 CONTRIBUTING 了解详细信息。

鸣谢

许可证

MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件