DOM中的DOMDocument

我刚开始阅读有关DOM的文档和示例,以便抓取和解析文档。

例如,我有如下所示的文档的一部分:

    <div id="showContent">
    <table>
    <tr>
        <td>
         Crap
        </td>
    </tr>
<tr>
          <td width="172" valign="top"><a href="link"><img height="91" border="0" width="172" class="" src="img"></a></td>
          <td width="10">&nbsp;</td>
          <td valign="top"><table cellspacing="0" cellpadding="0" border="0">
              <tbody><tr>
                <td height="30"><a class="px11" href="link">title</a><a><br>
                    <span class="px10"></span>
                </a></td>
              </tr>
              <tr>
                <td><img height="1" width="580" src="crap"></td>
              </tr>
              <tr>
                <td align="right">
                    <a href="link"><img height="16" border="0" width="65" src="/buy"></a>
                </td>
              </tr>
              <tr>
                <td valign="top" class="px10">
                    <p style="width: 500px;">description.</p>
                </td>
              </tr>
          </tbody></table></td>
        </tr>
    <tr>
        <td>
Crap
        </td>
    </tr>
    <tr>
        <td>
         Crap
        </td>
    </tr>
    </table>
    </div>

我试图使用下面的代码来获取所有的tr标签,并分析里面是否有废话或信息:

$dom = new DOMDocument();
@$dom->loadHTML($html);

$xpath = new DOMXPath($dom);


$tags = $xpath->query('.//div[@id="showContent"]');
foreach ($tags as $tag) {
    $string="";
    $string=trim($tag->nodeValue);
    if(strlen($string)>3) {
        echo $string;
        echo '<br>';
    }
}

不过,我得到的只是没有标签的剥离字符串,例如:

Crap

Crap
Title
Description

但我想得到:

<tr>
   <td>Crap</td>
</tr>
<tr>
   <a href="link">title</a>
</tr>

如何保留html节点(标签)?


如果你想使用DOM,你必须理解这个概念。 DOM文档中的所有内容(包括DOMDocument)都是一个节点。

DOMDocument是节点的分层树结构。 它从一个根节点开始。 该根节点可以有子节点,并且所有这些子节点都可以有自己的子节点。 基本上, DOMDocument中的所有内容都是某种类型的节点类型,无论是元素,属性还是文本内容。

          HTML                               Legend: 
         /                                  UPPERCASE = DOMElement
       HEAD  BODY                            lowercase = DOMAttr
      /                                     "Quoted"  = DOMText
    TITLE        DIV - class - "header"
     |             
"The Title"        H1
                    |
           "Welcome to Nodeville"

上图显示了一些DOMDocument节点。 有两个孩子(HEAD和BODY)的根元素(HTML)。 连接线称为轴。 如果沿着轴向TITLE元素的方向,你会看到它有一个DOMText叶子。 这很重要,因为它说明了一个经常被忽视的事情:

<title>The Title</title>

不是一个,而是两个节点。 带有DOMText子元素的DOME元素。 同样,这一点

<div class="header">

实际上是三个节点:带有DOMAttr的DOMElement持有DOMText。 因为所有这些继承了DOMNode的属性和方法,所以熟悉DOMNode类是非常重要的。

实际上,这意味着您提取的DIV链接到文档中的所有其他节点。 任何时候你都可以一直到根部,或者一直到叶子。 它在那里。 您只需查询或遍历文档以获取所需的信息。

无论你是通过迭代DIVchildNodes还是使用getElementByTagName()或XPath来做到这一点,都取决于你。 您只需要了解您不是使用原始HTML,而是使用代表整个HTML文档的节点。

如果您需要从文档中提取特定信息的帮助,则需要澄清要从中提取的信息。 例如,您可以询问如何从表中获取所有链接,然后我们可以回答如下内容:

$div = $dom->getElementById('showContent');
foreach ($div->getElementsByTagName('a') as $link) 
{
    echo $dom->saveXML($link);
}

但除非你更具体,否则我们只能猜测哪些节点可能是相关的。

如果您需要更多示例和代码片段来了解如何使用DOM浏览我以前对相关问题的解答:

  • https://stackoverflow.com/search?q=user%3A208809+DOM
  • 到目前为止,每个基本到中等的UseCase都应该有一个代码片段,你可能会使用DOM。


    要创建一个解析器,你可以使用htmlDOM。

    使用PHP编写DOM解析器非常简单。 通过使用它,您可以轻松获取div标签的内容。

    例如,找到所有具有属性idtext值的div标签。

    $ret = $html->find('div[id=text]');
    
    链接地址: http://www.djcxy.com/p/5067.html

    上一篇: DOMDocument in php

    下一篇: Grabbing the href attribute of an A element