【问题标题】:DOM Challenge -> Get text that is not in any elementDOM Challenge -> 获取不在任何元素中的文本
【发布时间】:2012-05-17 14:01:07
【问题描述】:

我是如何获得我的 dom 树的:

$html = file_get_contents('somefile.html');
$dom = new DOMDocument();
@$dom->loadHTML($html);
$dom_document = new DomXPath($dom);
$dom_object = $dom_document->query('somePathHere');

$dom_object的html结构:

<div>
  <a href='something'>some text here</a>
  I want this
</div>

这里有我需要的:

foreach($dom_object as $value){
     echo $value->getElementsByTagName('a')->item(0)->nodeValue; //working properly
     echo 'I want this' // I don't know how to get that 'I want this' text
}

precisions:我想避免进行多个 xpath 查询。我想坚持我的……提前谢谢你。干杯。马克

【问题讨论】:

  • div 是否有名称或 ID?如果不是,那么 div 标签出现的顺序是否总是相同的(就像它总是打开第二个 div 一样)?
  • 你好 Ahatius。 div标签没有id,结构总是一样的...
  • 正如@Ahatius 所说,您可以为您的 div 添加一个 ID,然后您可以获得文本。
  • 你好 MahanGM。向 div 添加 id 将如何解决我的问题?
  • @Mark 我不太喜欢 DOM,但应该有一些方法可以引用 div,然后删除子标签,然后只获取 div 内容本身。

标签: php dom html-parsing


【解决方案1】:

使用nodeType获取文本节点:

foreach($nodes as $node) {
    if($node -> nodeType == 3) {
        echo $node -> nodeValue . "<br />";
    }
}

解释:在 php DOMDocument 中,任何文本都在节点内。在您的情况下,它是一个文本节点,根据 PHP 的 XML_NODE_CONSTANTS 表示 3

详情:http://www.php.net/manual/en/class.domnode.php

【讨论】:

  • 我的节点类型为 1...所以你的建议不起作用
【解决方案2】:

我不知道您的 xml 的预期结构,但这适用于您的特定请求:

/html/body/div/text()

这仅选择具有相关 div 的直接父级的文本节点。您也可以使用一般的//div/text(),但更具体的查询通常更好/更快。

【讨论】:

  • Hello Explosion Pills...感谢您的帮助。尽管如此,正如提到的,我正在寻找一种不需要多个 xpath 查询的解决方案......
  • 请重读我的回答。您可以使用这些查询中的任何一个 .. 你不需要两个。
猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
相关资源
最近更新 更多