使用PHP从div类中提取所有内容(包括HTML)

时间:2013-02-21 15:00:17

标签: php dom extract

示例HTML ...

<html>
<head></head>
<body>
<table>
<tr>
    <td class="rsheader"><b>Header Content</b></td>
</tr>
<tr>
    <td class="rstext">Some text (Most likely will contain lots of HTML</td>
</tr>
</table>
</body>
</html>

我需要将HTML页面转换为该HTML页面的模板化版本。 HTML页面由几个框组成,每个框都有一个标题(在上面的代码中称为“rsheader”)和一些文本(在上面的代码中称为“rstext”)。

我正在尝试编写一个PHP脚本来检索HTML页面,可能使用file_get_contents然后提取rsheader和rstext div中的任何内容。基本上我不知道怎么样!我尝试过使用DOM,但我不太了解它,虽然我确实设法提取文本但它忽略了任何HTML。

我的PHP ......

<?php

$html = '<html>
<head></head>
<body>
<table>
<tr>
    <td class="rsheader"><b>Header Content</b></td>
</tr>
<tr>
    <td class="rstext">Some text (Most likely will contain lots of HTML</td>
</tr>
</table>
</body>
</html>';

$dom = new DomDocument();
$dom->loadHtml($html);
$xpath = new DomXpath($dom);
$div = $xpath->query('//*[@class="rsheader"]')->item(0);
echo $div->textContent;

?>

如果我执行print_r($ div),我会看到这个......

DOMElement Object
    (
    [tagName] => td
    [schemaTypeInfo] => 
    [nodeName] => td
    [nodeValue] => Header Content
    [nodeType] => 1
    [parentNode] => (object value omitted)
    [childNodes] => (object value omitted)
    [firstChild] => (object value omitted)
    [lastChild] => (object value omitted)
    [previousSibling] => 
    [nextSibling] => (object value omitted)
    [attributes] => (object value omitted)
    [ownerDocument] => (object value omitted)
    [namespaceURI] => 
    [prefix] => 
    [localName] => td
    [baseURI] => 
    [textContent] => Header Content
    )

正如您所看到的,textContent节点中没有HTML标签让我相信我会采用错误的方式:(

真的希望有人可以给我一些帮助...

提前致谢

2 个答案:

答案 0 :(得分:2)

X-Path可能比你完成这项任务需要更多的大锤。我会尝试使用DOMDocument的getElementById() method代替。下面是一个例子,改编自this post

注意:已更新为使用标记和类名而不是元素ID。

function getChildHtml( $node ) 
{
    $innerHtml= '';
    $children = $node->childNodes;

    foreach( $children as $child )
    {
        $innerHtml .= sprintf( '%s%s', $innerHtml, $child->ownerDocument->saveXML( $child ) );
    }

    return $innerHtml;
}

$dom = new DomDocument();
$dom->loadHtml( $html );

// Gather all table cells in the document.
$cells = $dom->getElementsByTagName( 'td' );

// Loop through the collected table cells looking for those of class 'rsheader' or 'rstext'.
foreach( $cells as $cell )
{
    if( $cell->getAttribute( 'class' ) == 'rsheader' )
    {
        $headerHtml = getChildHtml( $cell );
        // Do something with header html.
    }

    if( $cell->getAttribute( 'class' ) == 'rstext' )
    {
        $textHtml = getChildHtml( $cell );
        // Do something with text html.
    }
}

答案 1 :(得分:0)

看看这个答案并将其作为指导原则: retrieving specific data from a website

如果您需要详细的帮助,我随时为您提供帮助。