php Xpath使用innerHTML标签获取innerHTML

Posted

技术标签:

【中文标题】php Xpath使用innerHTML标签获取innerHTML【英文标题】:php Xpath getting innerHTML with innerHTML tags 【发布时间】:2011-12-13 06:19:00 【问题描述】:

我有一个格式如下的 html 文件:

<p class="p1">subject</p>
<p class="p2">detail <span>important</span></p>

<p class="p1">subject</p>
<p class="p2">detail<span>important</span></p>

我编写了一个 php 代码来自动获取每个 p1,并将它们插入到我的 mysql 表中。

这是我的代码:

$doc = new DOMDocument();

$doc->loadHTMLFile("file.html");

$xpath = new DomXpath($doc);

$subject = $xpath->query('//p');


for ($i = 0 ; $i < $subject->length-1 ; $i ++) 

if ($subject->item($i)->getAttribute("class") == "p1")
    echo $subject->item($i)->nodeValue;

...

这不是我的完整代码,但问题是:

echo $subject->item($i)->nodeValue;

这给了我&lt;p&gt;detail important&lt;/p&gt;,没有&lt;span&gt;&lt;/span&gt; 标签。

在细节的“重要”部分周围放置 span 标签非常重要。有什么功能可以做到不头痛吗?

提前致谢

【问题讨论】:

innerHTML in xPath?的可能重复 我发现了这个 SO 条目,希望对您有所帮助:***.com/questions/6286362/… 【参考方案1】:

我找到了问题的答案 :) 感谢 SimpleHTMLDOM

foreach($html->find('p') as $element) 

 switch ($element->class) 
      case 'p1':
                     $subject = $element;
                     break;
      case 'p2': $detail .= html_entity_decode($element);

 

诀窍在于:

html_entity_decode($element);

【讨论】:

【参考方案2】:

每当我需要解析 HTML 时,我都会通过 SimpleHTMLDOM 运行它:

http://simplehtmldom.sourceforge.net/

我建议使用 1.11 版本。由于各种原因,1.5 相当损坏。

【讨论】:

SimpleHTMLDOM 在设计上存在缺陷,因此我不推荐它,而是基于 DomDocument 的东西,另请参阅:***.com/questions/3606792/… 这里也有同样的问题。它只有 $element->plaintext。所以如果元素中有任何标签,它将被提取为纯文本:(【参考方案3】:

旧查询,但有一个单行。 OP应该使用:

$subject = $xpath-&gt;query('//p/*');

然后:

echo $doc-&gt;saveHtml($subject-&gt;item($i));

使用*,您将获得内部html(没有包装段落标签);如果没有 *,您将获得带有包装段落的 html;

完整示例:

$html = '<div><p>ciao questa è una <b>prova</b>.</p></div>';
$dom = new DomDocument($html);
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$node = $xpath->query('.//div/*'); // with * you get inner html without surrounding div tag; without * you get inner html with surrounding div tag
$innerHtml = $dom->saveHtml($node);
var_dump($innerHtml);

输出:&lt;p&gt;ciao questa è una &lt;b&gt;prova&lt;/b&gt;.&lt;/p&gt;

【讨论】:

以上是关于php Xpath使用innerHTML标签获取innerHTML的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XPath 获取节点值/innerHTML?

Xpath 和 innerHTML

php xpath如何从父元素内的多个元素中获取值

PHP DOM获取nodevalue html? (不剥离标签)

PHP nodeValue剥离html标签-innerHTML替代品?

innerHTML innerText的使用和区别