首页 > 解决方案 > 使用 Symfony DomCrawler 在 html 元素属性(data-react-props)中提取数据

问题描述

我需要提取页面内的json,更准确地说是标签内的divdata-react-props

<div data-react-class="GamePageHeader" data-react-props="{"id":1274,"slug":[...]}

如何提取反应道具中的 json?我相信使用 HtmlDomParser 我无法做到这一点。


编辑:

感谢 Prateek 的回复,我编写了代码:

use Symfony\Component\DomCrawler\Crawler;
use Symfony\Component\CssSelector\CssSelectorConverter;

$html = file_get_html('https://www.igdb.com/games/simcity--2');
$crawler = new Crawler($html);
$data = $crawler->filter('div[data-react-class="GamePageHeader"]')->attr('data-react-props');

print $data;

但我总是得到错误

LOG.error: Expecting a DOMNodeList or DOMNode instance, an array, a string, or null, but got "simple_html_dom".

我已经安装了软件包symfony/css-selectorsymfony/dom-crawler在 Laravel 5.8 中

标签: phpweb-scrapingdomcrawlersymfony-css-selector

解决方案


是的,您不能使用 HtmlDomParser 执行此操作。但是,这可以使用 symfomy 的dom crawler来完成。

第 1 步:使用 安装它,同时使用安装composer require symfony/dom-crawlercss -selectorcomposer require symfony/css-selector

第二步:获取html并实例化爬虫

$html = file_get_contents('https://www.igdb.com/games/simcity--2');
$crawler = new Crawler($html); // same as HtmlDomParser::str_get_html( $html);

第 3 步:使用过滤器抓取正文并获取所需的 dom 元素并使用 attr 获取标签内的值

$data = $crawler->filter('div[data-react-class="GamePageHeader"]')->attr('data-react-props');

推荐阅读