【问题标题】:Extracting dom elements from html using PHP Simple HTML DOM Parser使用 PHP Simple HTML DOM Parser 从 html 中提取 dom 元素
【发布时间】:2016-04-09 18:30:27
【问题描述】:

我正在尝试使用PHP Simple HTML DOM PARSERthis site 提取包括文本在内的文章链接。

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

编辑

【问题讨论】:

    标签: php html dom simple-html-dom


    【解决方案1】:

    有几个问题:

    • getElementsByTagName 显然返回单个节点,而不是数组,因此如果页面上有多个 article 标记,它将不起作用。请改用find,它会返回一个数组;
    • 但是一旦你进行了切换,你就不能在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);
        }
    }
    

    【讨论】:

    • 它确实有效,但在字符串中有一些编码的东西,我该如何处理? (编辑中的快照)
    • Microsoft back in China’s
    • 应该是Microsoft back in China's
    • 还有一件事,如果我想从每篇文章中提取几个元素并保存在不同的数组中,我当然可以再次运行相同的代码并将h2替换为不同的element 但是这样我们会多次提取文章,这是一种浪费。有没有办法一次获取所有文章,然后对它们进行操作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 2012-04-08
    相关资源
    最近更新 更多