简单的HTML DOM解析器无法解析标记

时间:2016-03-23 10:34:32

标签: php simple-html-dom

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

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

解析器无法识别< body>在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只有一个孩子,它是&lt; head&gt;标签。 &lt; body&gt;标签根本没有被解析。

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

2 个答案:

答案 0 :(得分:2)

该网站的HTML存在许多问题。请参阅W3 HTML validation report

  
      
  1. 错误 看到了结束标记div,但有打开的元素。
      从第134栏第47栏;到第134行,第52栏

    n Live</p></div>?             <
    
  2.   
  3. 错误 未关闭的元素a
      从第133行第5栏;到第133行,第90栏

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

......等等。

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

我认为Simple HTML DOM解析器在所有混乱中都会丢失。

答案 1 :(得分:1)

我建议您使用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