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;
这给了我<p>detail important</p>
,没有<span></span>
标签。
在细节的“重要”部分周围放置 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->query('//p/*');
然后:
echo $doc->saveHtml($subject->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);
输出:<p>ciao questa è una <b>prova</b>.</p>
【讨论】:
以上是关于php Xpath使用innerHTML标签获取innerHTML的主要内容,如果未能解决你的问题,请参考以下文章
PHP DOM获取nodevalue html? (不剥离标签)