使用PHP简单HTML DOM解析器从{html中提取dom元素

时间:2016-01-05 19:48:21

标签: php html dom simple-html-dom

我尝试使用this sitePHP Simple HTML DOM PARSER提取包含文字的文章的链接。

enter image description here

我想在主页面中提取文章的所有h2标记,并且我试图这样做:

    $html = file_get_html('http://www.winbeta.org');
    $articles = $html->getElementsByTagName('article');
    $a = null;

    foreach ($articles->find('h2') as $header) {
                $a[] = $header;
    }

    print_r($a);

根据手册,它应首先获取article标签内的所有内容,然后为每篇文章提取h2并保存在数组中。但相反它给了我:

enter image description here

修改 enter image description here

1 个答案:

答案 0 :(得分:4)

有几个问题:

  • getElementsByTagName显然会返回单个节点,而不是数组,因此如果页面上有多个 article 标记,则无效。而是使用确实返回数组的find;
  • 但是,一旦您进行了切换,就无法对find的结果使用find,因此您应该对每个匹配的文章标记执行此操作,或者更好地使用组合选择器作为find的参数;
  • 主要问题:您必须使用->plaintext显式检索节点的文本内容,否则您将获得该节点的对象表示及其所有属性和内部结构;
  • 部分文字包含’等HTML实体。这些可以使用html_entity_decode进行解码。

所以这段代码应该有效:

$a = array();
foreach ($html->find('article h2') as $h2) { // any h2 within article
    $a[] = html_entity_decode($h2->plaintext);
}

使用array_map,你也可以这样做:

$a = array_map(function ($h2) { return html_entity_decode($h2->plaintext); }, 
               $html->find('article h2'));

如果您还需要检索文章中的其他标签,将文本存储在不同的数组中,那么您可以执行以下操作:

$a = array();
$b = array();
foreach ($html->find('article') as $article) {
    foreach ($article->find('h2') as $h2) {
        $a[] = html_entity_decode($h2->plaintext);
    }
    foreach ($article->find('h3') as $h3) {
        $b[] = html_entity_decode($h3->plaintext);
    }
}