当前位置: 首页 > 面试题库 >

PHP中的DOMDocument

程峻
2023-03-14
问题内容

我刚刚开始阅读有关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是节点的分层树结构。它从根节点开始。该根节点可以有子节点,所有这些子节点都可以自己拥有子节点。基本上,a
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子级的DOMElement。同样,这

<div class="header">

实际上是三个节点:带有DOMAttr的DOMElement持有DOMText。由于所有这些都从DOMNode继承其属性和方法,因此必须熟悉DOMNode类。

实际上,这意味着您获取的DIV已链接到文档中的所有其他节点。您可以随时移至根元素或向下移至叶子。都在那里。您只需要查询或遍历文档以获取所需信息。

无论你做的是通过遍历childNodes中的DIV或使用getElementByTagName()或XPath是你。您只需要了解您不是在使用原始HTML,而是使用代表整个HTML文档的节点。

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

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

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



 类似资料:
  • 问题内容: 我正在构建一个Web应用程序,除其他事项外,该应用程序还需要连接到FTP服务器以下载或上传文件。该应用程序是用PHP编写的,并托管在Linux服务器上。 我想知道的是是否有可能也提供对SFTP服务器的支持,但是在Google上进行了一些快速搜索之后,看来这并不是那么简单。 因此,问题是:在PHP中使用SFTP的最佳方法是什么?是否有可以同时支持FTP和SFTP的类,以便可以对两者使用相

  • 问题内容: 我有一个简单的表单,可以生成一个新的相册,将标题和说明发送到MySQL,然后将用户重定向到可以上传照片的页面。 一切正常,直到“&”号进入方程式。信息从jQuery模态对话框发送到PHP页面,然后将条目提交到数据库。Ajax成功完成后,会将用户发送到带有GET URL的上传页面,以告知该页面它要上传到的专辑- 如果标题带有“&”号,则上传页面上的“标题”字段将无法正确显示。有没有办法逃

  • 本文向大家介绍PHP中的回文,包括了PHP中的回文的使用技巧和注意事项,需要的朋友参考一下 理查德·怀斯曼(Richard Wiseman)是一位心理学家,魔术师和作家,在http://richardwiseman.wordpress.com/上经营着一个小博客。他的博客谈论各种各样的事情,但是每个星期五他都会发布一个小难题,您可以尝试解决。 发布的最后一个难题谈到回文数和速度,这是完整的难题。

  • 问题内容: 我正在使用zend创建一个Web应用程序,在这里我创建了一个接口,用户A可以从该接口向多个用户发送电子邮件,并且效果很好,但是由于用户A等待太多,这会降低执行时间“已确认的回复”(将在电子邮件发送后显示。) 在Java中,我们可以通过“线程”执行该任务(发送电子邮件),并且不会减慢其余应用程序的速度。 与Java一样,PHP / Zend中是否有任何技术可以用来划分我们的任务,这可能会

  • 其实,我并不是因为迭代或者生成器或者研究 PHP 手册才认识的 yield,要不是协程,我到现在也不知道 PHP 中还有 yield 这么个鬼东西。人家这个东西是从 PHP 5.5 就开始引入了,官方名称叫做生成器。你要说为什么 5.5 年代的东西,现在才拿出来。我还想问你哟,PHP 5.3 就有了的 namespace 为毛到最近这几年才开始正式投产。 那么,问题来了,这东西到底是有何用? 先来

  • 本文向大家介绍PHP中“=>,包括了PHP中“=>的使用技巧和注意事项,需要的朋友参考一下 PHP的"=>"符号 在PHP中"=>"符号是用于在数组中分配键值对,主要在关联数组中使用。【视频教程推荐:PHP教程】 基本句式: key => value 说明:"=>"符号的左侧值称为键,右侧值称为键值。 “=>"符号的使用示例 下面通过简单代码示例来介绍"=>"符号的使用方法。 示例1:使用“=>”