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"> </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持有DOMText的DOMElement。 因为所有这些继承了DOMNode的属性和方法,所以熟悉DOMNode类是非常重要的。
实际上,这意味着您获取的DIV链接到文档中的所有其他节点。 你可以随时去根系元素或叶子。 都在那里 你只需要查询或遍历文件的所需信息。
无论你是通过迭代DIV
的childNodes
还是使用getElementByTagName()
或XPath来做到这一点,都取决于你。 你只需要明白,你不是使用原始的HTML,而是使用代表整个HTML文档的节点。
如果您需要从文档中提取特定信息的帮助,则需要澄清要从中提取的信息。 例如,你可以问如何从表中获取所有的链接,然后我们可以回答这样的问题:
$div = $dom->getElementById('showContent'); foreach ($div->getElementsByTagName('a') as $link) { echo $dom->saveXML($link); }
但除非你更具体,否则我们只能猜测哪些节点可能是相关的。
如果您需要更多的示例和代码片段,了解如何使用DOM浏览以前的相关问题的答案:
到现在为止,每个基本到中等UseCase都应该有一个代码片断,你可能会用到DOM。
要创建一个解析器,你可以使用htmlDOM 。
使用php编写DOM解析器非常简单。 通过使用它,您可以轻松获取div
标签的内容。
例如,找到所有具有属性id
和text
值的div
标签。
$ret = $html->find('div[id=text]');