【问题标题】:Extract data inside an html element attribute (data-react-props) using Symfony DomCrawler使用 Symfony DomCrawler 在 html 元素属性(data-react-props)中提取数据
【发布时间】:2019-08-17 17:04:41
【问题描述】:

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

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

如何提取 react props 中的 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".

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

【问题讨论】:

  • 请添加代码尝试。
  • 嗨@aviya.developer,现在可以了吗?
  • 是的,太好了。总是在问题中添加一些代码尝试。

标签: php web-scraping domcrawler symfony-css-selector


【解决方案1】:

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

第 1 步:使用composer require symfony/dom-crawler 安装它,同时使用composer require symfony/css-selector 安装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');

【讨论】:

  • 要在网址中进行刮擦,我必须这样写吗? $html = file_get_html('https://www.igdb.com/games/simcity--2') 不幸的是,我找不到太多文档。 ps:如果有用的话,我正在使用 Laravel
  • 是的,您确实需要使用该行。还要确保您已将 use Symfony\Component\DomCrawler\Crawler; 添加到您正在使用它的类中。您还需要 symfony 的 css 选择器包才能使过滤器中的 css 选择器工作。 composer require symfony/css-selector我已经更新了答案以反映这一点。欢迎随时查看documentation
  • 我在您的帮助下更新了问题,但我仍然遇到问题
  • 我看到你更新了,你可以通过更新 $html 变量的初始化来解决这个问题,这可以通过使用$html = file_get_html('https://www.igdb.com/games/simcity--2')-&gt;plaintext; 来解决,或者更简单的方法是使用 file_get_contents 而不是像@987654332 @,我也更新了我的答案以反映这一点。
猜你喜欢
  • 2016-06-07
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
相关资源
最近更新 更多