【问题标题】:Extract plaintext within Div that includes other dom elements but not within any tags在包含其他 dom 元素但不在任何标签内的 Div 中提取明文
【发布时间】:2011-05-19 12:14:11
【问题描述】:

我正在尝试使用 PHP 提取一些未包含在任何标签中的纯文本。最好的解释方式是展示;

<div>
    <span>Hello</span>
        THIS IS THE TEXT I WANT TO EXTRACT
    <span>this is some other text</span>
    <div><span>pow</span></div>
</div>

我即将尝试的是循环并删除 div 中的所有 dom 元素,这应该留下文本。但我希望有一个更优雅的方法:)

谢谢

安迪

【问题讨论】:

    标签: php html dom scrape


    【解决方案1】:

    如果我正确阅读了您的问题,您希望获取元素的文本,但不包括子元素的文本。

    使用 JavaScript,这里有一个解决方案:

    http://www.stevefenton.co.uk/Content/Blog/Date/201007/Blog/Jquery-Get-Text-While-Excluding-Children/

    总而言之,你会这样做......

    $("#mydiv").clone().children().remove().end().text();
    

    在 PHP(使用 phpquery)中,这将是......

    $phpqueryObj = phpQuery::newDocument(DOMinnerHTML($INNERHTMLOFYOURDOMELEMENT));
    $text = $phpqueryObj->clone()->children()->remove()->end()->text();
    

    如果没有 jQuery / JavaScript,您将不得不手动执行类似的过程,即从元素的克隆版本中删除子元素,然后获取内部文本。

    【讨论】:

    • 这适用于 phpquery(我没有使用 javascript)。上帝知道怎么做 :D 但确实如此!谢谢Sohnee
    【解决方案2】:

    给定上下文节点,最简单的方法可能是使用 XPath。

    $dom = new DOMDocument;
    $dom->loadHTML($html);
    $xpath = new DOMXPath($dom);
    //find all div nodes
    foreach ($xpath->query('//div') as $div) {
       //get any immediate child text nodes
       foreach ($xpath->query('text()', $div) as $text) {
          echo "$text->nodeValue\n";
       }
    }
    

    请注意,第一个查询将返回 all 个 div,因此您必须针对所需的 div 使其更具体。

    我在您的示例中测试了上面的代码,它可以工作。

    【讨论】:

    • 这个方法也可以,但是由于它的复杂性 n2(循环内循环),这可能比其他版本慢
    • 你需要回学校了。这是 O(log n),在最坏的情况下是 O(n)(我不知道 DOMDocument 的内部工作原理)。两个循环不会 O(n^2) 产生。我也不知道 $()、.clone()、.children()、.remove()、.end()、.text() 的内部工作原理……你怎么知道这些都不是O(n^2) 他们自己?
    • 确实,另一个可能更复杂。对不起我的计算错误(正在考虑一个 for 循环)。请注意,尽管我仍然对您的评论进行了评分:)
    • 您可以使用//div/text() 作为xpath 表达式来保存内部循环。
    • 不错的 Yoshi,我发誓 xpath 是一门黑暗艺术
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2022-07-06
    • 2017-01-12
    相关资源
    最近更新 更多