【问题标题】:Parse JSON data inside from occurrence of script tag using SimpleHtmlDom - PHP使用 SimpleHtmlDom 从脚本标记的出现中解析 JSON 数据 - PHP
【发布时间】:2020-04-17 11:14:30
【问题描述】:

我正在使用简单的 html dom 来解析一个链接,该链接包含两个 type=application/ld+json 的脚本标签。

目标网站结构如下,

// tag that I want to parse
<script type="application/ld+json">
Some JSON Data
</script>


// tag that I **do not want** to parse
<script type="application/ld+json">
Some JSON Data
</script>

现在正如我上面展示的,我只想解析第一个里面的数据,为此我使用以下代码

foreach($html->find('script[type="application/ld+json"]',0) as $name)
{
   echo $name->innertext;
}

当我试图通过在 find() 函数中指定“0”来提取第一次出现的 时,这给了我以下错误。

Trying to get property of non-object in C:\xampp\htdocs\htmldom\example\example_basic_selector.php on line 14

任何人都知道我做错了什么或者我该如何解决这个问题?谢谢

【问题讨论】:

  • 那么您是说没有,0,它可以工作并向您显示这两个脚本元素的内部文本?如果不是,那么这意味着您的选择器与开始的元素不匹配。
  • @CBroe 完全正确。如果我不使用“0”或其他任何东西,它会显示来自两个脚本标签的数据。
  • 我想如果您只要求返回一个特定元素,那么尝试 循环 是错误的。 find('foo') 返回一个数组find('foo', 0) 返回一个特定元素。 $script = $html-&gt;find('script[type="application/ld+json"]',0); echo $script-&gt;innertext; 能满足您的需求吗?
  • 我应该告诉你var_dump的结果还是试试你刚才贴的上面的代码?
  • Nigel 的回答已经证实了我的怀疑,所以只需使用他们的代码,它应该可以工作。

标签: php json parsing web-scraping simple-html-dom


【解决方案1】:

如果你指定你想要的实例的索引,你只会得到那个元素而不是一个列表,所以循环不是必需的(实际上是问题)......

$json = $html->find('script[type="application/ld+json"]',0);
echo $json->innertext;

仅供参考,代码来自find()...

    // return nth-element or array
    if (is_null($idx)) return $found;
    else if ($idx<0) $idx = count($found) + $idx;
    return (isset($found[$idx])) ? $found[$idx] : null;

【讨论】:

    猜你喜欢
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多