【问题标题】:SImple HTML DOM parser not parsing <body> tag简单的 HTML DOM 解析器不解析 <body> 标签
【发布时间】:2016-03-23 10:34:31
【问题描述】:

我正在使用这个 simple_html_dom 解析器来尝试解析外部 url。我可以在大多数页面上正确使用它。

但是,当我尝试解析网站时 http://talksport.com/football/atletico-madrid-beat-arsenal-and-west-ham-signing-portuguese-wonderkid-diogo-jota

解析器无法识别 html 中的

标签。
require 'simple_html_dom.php';

$html = file_get_html('http://talksport.com/football/atletico-madrid-beat-arsenal-and-west-ham-signing-portuguese-wonderkid-diogo-jota');

// Find any tag for eg. <div>
$tag = $html->find('div',0);
var_dump($tag);

我得到 null 作为结果。

我试图弄清楚为什么会发生这种情况并发现

$x = $html->find('html',0)->children();

$x 只有一个子标签,即

标签。 标签根本不被解析。

以前有人遇到过这样的问题吗?请帮忙。

【问题讨论】:

    标签: php simple-html-dom


    【解决方案1】:

    该网站的 HTML 存在许多问题。见W3 HTML validation report

    1. 错误 已看到结束标记div,但存在开放元素。
      从第 134 行第 47 列开始;到第 134 行,第 52 列

      n Live</p></div>?             <
      
    2. 错误未闭合元素a
      从第 133 行第 5 列开始;到第 133 行,第 90 列

      </h2>?                <a href="/live" class="listenLiveButtonTrigger" onclick="listenLive(1);return false;">?                 
      

    ...等等

    提到了重复的 id 值、杂散的结束标签、无效的属性、使用子样式标签……以及更多问题。

    我认为简单的 HTML DOM 解析器只是迷失在所有这些混乱中。

    【讨论】:

      【解决方案2】:

      我建议你使用 DOMDocument 类和 cURL,像这样:

      $url = "http://talksport.com/football/atletico-madrid-beat-arsenal-and-west-ham-signing-portuguese-wonderkid-diogo-jota";
      
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, $url);
      $curlReturn = curl_exec($ch);
      
      $html = new DOMDocument();
      $html->loadHTML($curlReturn);
      $body = $html->getElementsByTagName("body");
      
      curl_close($ch);
      

      它比简单的解析器更强大。 http://php.net/manual/en/class.domdocument.php http://php.net/manual/en/book.curl.php

      【讨论】:

      • DOMDocument 给了我很多警告,因为 html 格式不正确。例如。 DOMDocument::loadHTML(): 结束标签:预期 '>'在实体中,行:132
      • 谢谢。想出了如何使用 libxml_use_internal_errors 禁用警告
      最近更新 更多