【问题标题】:simple_html_dom not returning <h1> elements?simple_html_dom 不返回 <h1> 元素?
【发布时间】:2013-03-25 04:33:21
【问题描述】:

我正在使用 SIMPLE_HTML_DOM 测试解析器,并在解析时 从该 URL 返回的 HTML DOM:HERE

它没有找到 H1 元素... 我尝试成功返回所有 div。

我正在使用一个简单的请求来诊断这个问题:

foreach($html->find('H1') as $value) { echo "<br />F: ".htmlspecialchars($value); } 

在查看源代码时,我意识到:

  • h1 是大写 -> H1 - 但 SIMPLE_HTML... 正在处理:

                //PaperG - If lowercase is set, do a case insensitive test of the value of the selector.
            if ($lowercase) {
                $check = $this->match($exp, strtolower($val), strtolower($nodeKeyValue));
            } else {
                $check = $this->match($exp, $val, $nodeKeyValue);
            }
            if (is_object($debugObject)) {$debugObject->debugLog(2, "after match: " . ($check ? "true" : "false"));}
    

任何机构都可以帮助我了解这里发生了什么吗?

【问题讨论】:

  • 注意区别:H1 != h1。并且您可以打印来自$html 的所有结果,以防丢失。
  • 你的浏览器 DOM 说什么?您链接到的页面包含无效的 HTML,因此 PHP 的解析器可能会因错误而窒息。
  • H1 不是我知道的 h1,但是简单的 html dom 解析器正在通过降低输入标签和匹配标签的大小写来处理它......(经过测试)。浏览器上显示的 dom 正在查找包含文章标题的 h1 标记(页面上只有一个) - 在页面源上搜索 class=text20b 你会找到它。我回显 $html 和 h1 在那里!?这很令人困惑......
  • 在 URl 中,他们使用的是 H1 。这超出了标准的 AFAIK,可能会导致问题。
  • 尝试下载页面并将 H1 更改为 h1 然后解析,它应该可以工作。你的代码看起来不错:)

标签: php parsing web-crawler simple-html-dom


【解决方案1】:

试试这个

        $oHtml = str_get_html($html);
        foreach($oHtml->find('h1') as $element)
        {
            echo $element->innertext;
        }

您还将使用正则表达式跟随函数返回一个包含所有 h1 标记的内部文本的数组

  function getH1($yourhtml)
{
    $h1tags = preg_match_all("/(<h1.*>)(\w.*)(<\/h1>)/isxmU", $yourhtml, $patterns);
    $res    = array();
    array_push($res, $patterns[2]);
    array_push($res, count($patterns[2]));
    return $res;
}

【讨论】:

    【解决方案2】:

    找到了……

    但无法解释!

    我用包括 H1(大写)在内的另一个代码进行了测试,它工作正常。

    在使用 SIMPLE_HTML_DOM 代码时,我评论了“remove_noise”,现在它可以工作了 完美,我认为这是因为这个网站有无效的 HTML 和 噪声去除器去除了太多并且在结束标记脚本之后没有结束:

        // $this->remove_noise("'<\s*script[^>]*[^/]>(.*?)<\s*/\s*script\s*>'is");
        // $this->remove_noise("'<\s*script\s*>(.*?)<\s*/\s*script\s*>'is");
    

    感谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 2017-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 2015-01-11
      相关资源
      最近更新 更多