DOM文档在php中
Posted
技术标签:
【中文标题】DOM文档在php中【英文标题】:DOMDocument in php 【发布时间】:2011-06-26 04:12:51 【问题描述】:我刚刚开始阅读有关 DOM 的文档和示例,以便抓取和解析文档。
例如,我有部分文档如下所示:
<div id="showContent">
<table>
<tr>
<td>
Crap
</td>
</tr>
<tr>
<td valign="top"><a href="link"><img border="0" class="" src="img"></a></td>
<td > </td>
<td valign="top"><table cellspacing="0" cellpadding="0" border="0">
<tbody><tr>
<td ><a class="px11" href="link">title</a><a><br>
<span class="px10"></span>
</a></td>
</tr>
<tr>
<td><img src="crap"></td>
</tr>
<tr>
<td align="right">
<a href="link"><img border="0" 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节点(标签)?
【问题讨论】:
见innerHTML in php's DOMDocument。 您的 XPath 与 div 匹配。要获得您显示的 HTML,您必须使用不同的 XPath 查询/查询,然后将结果传递给echo $dom->save($node)
。请说明你想要得到什么。
@netcoder innerHTML 这里根本不需要。
@netcoder 谢谢你的链接
@Gordon,我正在尝试获取一个页面的信息并将其显示在另一个页面中,但是该页面在表格中列出了很多信息,有些是相关的,有些不是,我有我想要的图片、标题和描述,然后是我不关心的样式、数字,但我想获取 div 内的 html 以分析数据的相关性,我的代码得到所有字符串和我不知道它是 td、原始 td 中的 div 还是其他东西(所有信息都在那个大 div 中)
【参考方案1】:
如果你想使用 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 子元素的 DOMElement。同样,这个
<div class="header">
实际上是三个节点:带有 DOMAttr 的 DOMElement 和 DOMText。因为所有这些都从 DOMNode 继承了它们的属性和方法,所以熟悉DOMNode class.
实际上,这意味着您获取的 DIV 链接到文档中的所有其他节点。您可以在任何时候一直到根元素或向下到叶子。这一切都在那里。您只需查询或遍历文档以获取所需信息。
您是通过迭代DIV
的childNodes
还是使用getElementByTagName()
或XPath 来做到这一点取决于您。您只需要了解您使用的不是原始 HTML,而是代表整个 HTML 文档的节点。
如果您在从文档中提取特定信息方面需要帮助,则需要说明您希望从中获取哪些信息。例如,您可以询问如何从表中获取所有链接,然后我们可以回答如下:
$div = $dom->getElementById('showContent');
foreach ($div->getElementsByTagName('a') as $link)
echo $dom->saveXML($link);
但除非您更具体,否则我们只能猜测哪些节点可能是相关的。
如果您需要更多关于如何使用 DOM 的示例和代码 sn-ps,请浏览我之前对相关问题的回答:
https://***.com/search?q=user%3A208809+DOM到现在为止,对于每个基本到中等的 DOM 用例,都应该有一个 sn-p。
【讨论】:
谢谢 Gordon,我需要这样的东西来了解 dom 是如何工作的,但我认为我不能用它来抓取我需要的信息,因为它们不遵循任何标准并且没有类、id 或类似的东西,只有表格 :( 无论如何,该信息对学习如何使用它很有用 =D +1 ...我一直在寻找 Nodeville 的地图!【参考方案2】:要创建解析器,您可以使用htmlDOM。
用php编写的DOM解析器非常简单易用。使用它可以轻松获取div
标签的内容。
例如,查找所有具有id
属性且值为text
的div
标签。
$ret = $html->find('div[id=text]');
【讨论】:
这对我来说做得更好。我正在使用一个 html 非常糟糕的网站。 domdocument 找不到我想要的节点。这个库可以更好地处理糟糕的 html。以上是关于DOM文档在php中的主要内容,如果未能解决你的问题,请参考以下文章