我正在使用file_get_contents
来获取远程页面的html源代码,代码由许多表组成。
我要做的是代码中有许多<td>
,如下面的那个
<td colspan="2">
<b>Video </b>
<span class="section">Sports</span><b>: </b>
<span id="category466" class="category">Motor Sports</span>
</td>
我想在关闭</td>
<div style="float: right; padding-right: 2px;"><a class="open_event_tab" target="_blank" href="page123.html" >open event</a></div>
我的代码现在看起来像这样:
<?php
//Get the url
$url = "http://remotesite.com/page1.html";
$html = file_get_contents($url);
$doc = new DOMDocument(); // create DOMDocument
libxml_use_internal_errors(true);
$doc->loadHTML($html); // load HTML you can add $html
$elements = $doc->getElementsByTagName('td');
?>
我停在getElementsByTagName然后我不知道如何添加上面描述的div。
答案 0 :(得分:0)
此代码现在可以使用更新的HTML(代码下方)。它会将div插入到您想要的位置。
<?php
//Get the url
$url = "http://remotesite.com/page1.html";
$html = file_get_contents($url);
$doc = new DOMDocument('1.0'); // create DOMDocument
libxml_use_internal_errors(false);
$doc->loadXML($html); // load HTML you can add $html
$domxpath = new DOMXPath($doc);
$filtered = $domxpath->query("//td[@colspan='2']");
$nodeList = $doc->getElementsByTagName('td');
$length = $filtered->length;
$nodes = array();
for ($i = $length - 1; $i >= 0; --$i) {
$node = $filtered->item($i);
$lastChildHTML = $doc->saveXML($node->lastChild);
if (strpos($lastChildHTML, 'class="category"') !== false) {
$nodes[] = $node;
}
}
$allTDNodes = $doc->getElementsByTagName('td');
$tdNodes = array();
foreach ($allTDNodes as $tdNode) {
if (in_array($tdNode, $nodes, true)) {
$tdNodes[] = $tdNode;
}
}
$tdNodes = array_reverse($tdNodes);
$length = count($nodes, 0);
for ($i = 0; $i < $length; $i++) {
$replacement = $doc->createDocumentFragment();
$nodeContent = $doc->saveXML($tdNodes[$i]);
$replacement->appendXML($nodeContent);
$divNode = createDivNode($doc);
$replacement->firstChild->appendChild($divNode);
$tdNodes[$i]->appendChild($divNode);
}
echo $doc->saveXML();
function createDivNode($doc) {
$divNode = $doc->createElement('div');
$divNode->setAttribute('style', 'float: right; padding-right: 2px;');
$aNode = $doc->createElement('a', 'openEvent');
$aNode->setAttribute('class', 'open_event_tab');
$aNode->setAttribute('target', '_blank');
$aNode->setAttribute('href', 'page123.html');
$divNode->appendChild($aNode);
return $divNode;
}
我有updated the used HTML使其符合XHTML并修复了样式问题(相关区域的css属性高度:附加了0px)。
答案 1 :(得分:0)
阅读文档!
DOMDocument::getElementsByTagName()
方法返回DOMNodeList
的实例。
DOMNodeList
实现Traversible
接口,这意味着它可以在foreach
循环中使用。您还可以使用DOMNodeList::$length
属性和DOMNodeList::item($index)
方法对其进行循环。
循环DOMNodeList
您将使用DOMNode
的实例。 DOMNode
类有一个名为DOMNode::appendChild()
的方法,有趣的是,它以DOMNode
作为参数。
现在你只需要创建DOMNode
并附加它。使用DOM可能不是直观的,但是一旦熟悉了文档,至少它是简单。
将this page放在枕头下。