DOMDocument-如何从样式/脚本标签中获取所有内部文本?

问题描述

我花了很多时间在一件非常简单的事情上,不得不在这里发布StackOverflow

我想获取除脚本/样式标签之外的所有内部文本

$doc = new DOMDocument;

$doc->preserveWhiteSpace = false;

$html = <<<EOD
<div>
        <script>var main=0</script>
        <div>
            <p>my</p>
            <script>var inner=0</script>
        </div>
        <p>text</p>
        only
</div>
EOD;

$doc->loadHTML($html);

$xpath = new DOMXPath($doc);

echo $entries = $xpath->query('//*[not(self::script)]')->item(0)->nodeValue;

给我

var main=0 my var inner=0 text only

也尝试过

$entries = $xpath->query('//*[not(self::script)]');
foreach ($entries as $entry) {
    if ($entry->tagName == 'style' || $entry->tagName == 'script') {
        continue;
    }
    echo preg_replace('/\s\s+/',' ',$entry->nodeValue);
}

给我

var main=0 my var inner=0 text only var main=0 my var inner=0 text only var main=0 my var inner=0 text only my var inner=0mytext

我尝试了多个xpath,但是没有用

我想要的输出my text only

我是Scrapy开发人员,我在Scrapy中很容易做到这一点,但是今天对PHP的日子不好过

解决方法

不幸的是,PHP不支持xpath 2.0(IIRC也不支持Scrapy),因此本来容易的name()方法不可用...

我能想到的最接近的是以下内容,它应该使您足够接近(请注意,由于您的<style>中没有$html标签,因此我只关注{{1} }):

<script>

输出:

$entries = $xpath->query('//*[not(./text()/parent::script)]/text()');
foreach ($entries as $entry) {

    echo trim($entry->textContent) . " ";
    
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...