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

Extracting dom elements from html using PHP Simple HTML DOM Parser

我正在尝试从 this site using PHP Simple HTML DOM PARSER.

中提取包括文本在内的文章链接

我想提取主页中文章的所有 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 并保存在数组中。但它给了我:

编辑

有几个问题:

  • getElementsByTagName 显然 return 是一个节点,而不是一个数组,所以如果页面上有多个 article 标签,它就不起作用.而是使用 find 做 return 一个数组;
  • 但是一旦你做出那个切换,你就不能在 find 的结果上使用 find,所以你应该对每个匹配的 article标记,或者更好地使用组合选择器作为 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);
    }
}