php Xpath使用innerHTML标记获取innerHTML

时间:2011-10-22 17:25:39

标签: php html xpath

我有一个格式如下的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标签围绕细节的“重要”部分非常重要。是否有任何功能可以做到这一点而不会头痛?

提前致谢

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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

http://simplehtmldom.sourceforge.net/

我建议使用1.11版。出于各种原因,1.5相当破碎。

答案 2 :(得分:0)

旧查询,但是有一个直线。 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>