使用php dom文件打印html表

时间:2011-09-16 06:39:47

标签: php domdocument dom

需要帮助,

我想使用php domdocument在我们的网页上打印这个html代码,但很难 我也在下面编写代码。你能帮我吗?

<table width="610" id="machine" border="0" cellSpacing="10"
    cellPadding="0">

    <TBODY>
        <TR>
            <TD colSpan=2 align=left>
            <DIV id=breadcrumbs><A href="/new-and-used-machinery.php">All
            Machines</A> &nbsp;&gt;&nbsp; <A
                href="/listing.php?cat=Air+Compressors">Air Compressors</A>
            &nbsp;&gt;&nbsp;</DIV>
            <DIV id=ForSale>FOR SALE:</DIV>
            <H1>5 CFM Used Speedaire Air Compressor, Single Phase, 60 Gallon
            tank, 1.5 H.P. #A1194</H1>
            </TD>
        </TR>
        <TR>
            <TD id=photos vAlign=top width=270 align=middle>
            <DIV id=ClickPhotos>Click On Photos For Larger Image:</DIV>
            <!-- PHOTOS DB div style="margin-bottom:12px"><img src="thumb.php?id=A1194.jpg&amp;w=250&amp;h=250"></div --><!-- ORIG PHOTOS div style="margin-bottom:12px"><img src="thumb.php?f=A1194.jpg&amp;w=250&amp;h=250"></div -->
            <DIV style="MARGIN-BOTTOM: 12px"><A
                href="/photos.php?id=7135&amp;p=1"><IMG
                title="Used Speedaire Air Compressor"
                alt="Used Speedaire Air Compressor"
                src="/class/class_Image.php?load=cGhvdG9zL0ExMTk0LmpwZ3wyNTB8MjUwfDF8"></A>
            </DIV>
            <!-- PHOTOS DB div style="margin-bottom:12px"><img src="thumb.php?id=A1194_1.jpg&amp;w=250&amp;h=250"></div --><!-- ORIG PHOTOS div style="margin-bottom:12px"><img src="thumb.php?f=A1194_1.jpg&amp;w=250&amp;h=250"></div -->
            <DIV style="MARGIN-BOTTOM: 12px"><A
                href="/photos.php?id=7135&amp;p=2"><IMG
                title="Used Speedaire Air Compressor"
                alt="Used Speedaire Air Compressor"
                src="/class/class_Image.php?load=cGhvdG9zL0ExMTk0XzEuanBnfDI1MHwyNTB8MXw="></A>
            </DIV>
            </TD>
            <TD id=details vAlign=top width=310 align=left>
            <TABLE
                style="BORDER-BOTTOM: #cdcdcd 1px solid; BORDER-LEFT: #cdcdcd 1px solid; PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #eee; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; BORDER-TOP: #cdcdcd 1px solid; BORDER-RIGHT: #cdcdcd 1px solid; PADDING-TOP: 10px; -moz-border-radius: 10px; -webkit-border-radius: 10px"
                id=machine_buttons border=0 cellSpacing=3 cellPadding=0>
                <TBODY>
                    <TR>
                        <TD><A onmouseover="swapImg('Manufact', true)"
                            onmouseout="swapImg('Manufact', false)"
                            href="/manufacturer.php?brand=Speedaire"><IMG id=icon_Manufact
                            border=0 alt="" src="/images/machine_button_Manufact.gif"
                            width=66 height=33><BR>
                        Manufacturer Info</A></TD>
                    </TR>
                    <TR>
                        <TD><A onmouseover="swapImg('Category', true)"
                            onmouseout="swapImg('Category', false)"
                            href="/listing.php?cat=Air+Compressors"><IMG id=icon_Category
                            border=0 alt="" src="/images/machine_button_Category.gif"
                            width=66 height=33><BR>
                        Similar Machines</A></TD>
                    </TR>
                    <TR>
                        <TD><A onmouseover="swapImg('Brochure', true)"
                            onmouseout="swapImg('Brochure', false)"
                            href="/manufacturer.php?brand=Speedaire#brochures" target=_blank><IMG
                            id=icon_Brochure border=0 alt=""
                            src="/images/machine_button_Brochure.gif" width=66 height=33><BR>
                        OEM Brochure</A></TD>
                    </TR>
                    <TR>
                        <TD><A style="CURSOR: pointer" id=shadowbox_email class=sb
                            title="Used Speedaire Air Compressor" href="/share.php?id=7135"
                            rel=shadowbox;width=520;height=500 shadowboxCacheKey="1"
                            onMouseOver="swapImg('Email', true)"
                            onMouseOut="swapImg('Email', false)" jQuery1316148993734="2"><IMG
                            id=icon_Email border=0 alt=""
                            src="/images/machine_button_Email.gif" width=66 height=33
                            jQuery1316148993734="3"><BR>
                        Email A Friend</A></TD>
                    </TR>
                    <TR>
                        <TD><A onmouseover="swapImg('Ship', true)"
                            onmouseout="swapImg('Ship', false)" href="/shipping.php?id=7135"><IMG
                            id=icon_Ship border=0 alt=""
                            src="/images/machine_button_Ship.gif" width=66 height=33><BR>
                        Shipping</A></TD>
                    </TR>
                </TBODY>
            </TABLE>
            <DIV id=QuickQuote><A href="/machine-print.php?id=7135" target=_blank><IMG
                title="Print a Quick Quote!" border=0 alt="Print a Quick Quote!"
                align=absMiddle
                src="http://www.sterlingmachinery.com/images/quick_quote.jpg"> </A></DIV>
            <DIV style="MARGIN: 5px 0px 0px 45px">
            <FORM method=post name=addmachine action=/request-quote.php
                jQuery1316148993734="5"><INPUT id=add
                title="Add Machine to Quote Cart" value="Add Machine to Quote Cart"
                alt="Add Machine to Quote Cart"
                src="http://www.sterlingmachinery.com/images/quick_add.jpg"
                type=image name=add jQuery1316148993734="7"> <IMG
                style="DISPLAY: none; CURSOR: pointer" id=remove
                title="Remove from quote cart" name=remove
                alt="Remove from quote cart" src="/images/remove.gif" width=16
                height=16 jQuery1316148993734="8">
            <DIV style="MARGIN-TOP: 5px"><INPUT id=view title="View Quote Cart"
                value="View Quote Cart" alt="View Quote Cart"
                src="http://www.sterlingmachinery.com/images/quick_view.jpg"
                type=image name=view></DIV>
            </FORM>
            </DIV>
            <BR>
            <TABLE id=machine_stats border=0 cellSpacing=5 cellPadding=0
                width=300>
                <TBODY>
                    <TR>
                        <TD class=field vAlign=top align=right>Stock #</TD>
                        <TD vAlign=top align=left>A1194</TD>
                    </TR>
                    <TR>
                        <TD class=field vAlign=top align=right>Manufacturer:</TD>
                        <TD vAlign=top align=left><A
                            href="/manufacturer.php?brand=Speedaire">Speedaire</A></TD>
                    </TR>
                    <TR>
                        <TD class=field vAlign=top align=right>Model:</TD>
                        <TD vAlign=top align=left><A
                            href="/listing.php?cat=Air+Compressors"></A></TD>
                    </TR>
                    <TR>
                        <TD class=field vAlign=top align=right>Capacity:</TD>
                        <TD vAlign=top align=left><A
                            href="/listing.php?cat=Air+Compressors">5 CFM</A></TD>
                    </TR>
                    <TR>
                        <TD class=field vAlign=top align=right>Price:</TD>
                        <TD vAlign=top align=left><SPAN style="BACKGROUND-COLOR: #ffff00">$350</SPAN></TD>
                    </TR>
                    <TR>
                        <TD class=field vAlign=top align=right>Category:</TD>
                        <TD vAlign=top align=left><A
                            href="/results.php?keywords=Air+Compressors">Air Compressors</A></TD>
                    </TR>
                    <TR>
                        <TD class=field vAlign=top align=right>Condition:</TD>
                        <TD vAlign=top align=left>Used Machinery</TD>
                    </TR>
                </TBODY>
            </TABLE>
            <FIELDSET><LEGEND>Full Description</LEGEND>
            <TABLE id=machine_specs border=0 cellSpacing=0 cellPadding=4
                width=300>
                <TBODY>
                    <TR>
                        <TD
                            style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px"
                            class=field vAlign=top align=right>CFM Rating:</TD>
                        <TD
                            style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px"
                            vAlign=top align=left>5</TD>
                    </TR>
                    <TR>
                        <TD class=field vAlign=top align=right>Tank Size:</TD>
                        <TD vAlign=top align=left>60 Gallon</TD>
                    </TR>
                    <TR>
                        <TD class=field vAlign=top align=right>Weight:</TD>
                        <TD vAlign=top align=left>400 LBS.</TD>
                    </TR>
                </TBODY>
            </TABLE>
            </FIELDSET>
            <FIELDSET><LEGEND>Equipped With</LEGEND>Single Phase Motor<BR>
            Horsepower: 1 1/2</FIELDSET>
            <DIV class=privates>* Temporary specifications subject to
            verification.<BR>
            &nbsp; All quotations subject to prior sale.</DIV>
            </TD>
        </TR>
    </TBODY>

</table>

我已经编写了这段代码,但它没有得到正确的解决。 外部foreach循环运行17次,但应该只有两次,因为外部表只有两行。

$xml = new DOMDocument();
$xml->validateOnParse = true;
$xml->loadHTMLFile($url);

$xpath = new DOMXPath($xml);

$table =$xpath->query("//*[@id='machine']")->item(0);

echo "<table border=2>";
$rows = $table->getElementsByTagName("tr");

foreach ($rows as $row) //there i only two rows. 
{
echo "<tr>";
  $cells = $row -> getElementsByTagName('td');

  foreach ($cells as $cell) 
  {
   echo "<td>";
   foreach ($cell->getElementsByTagName('table') as $innerTable )
   {
      foreach ( $innerTable->getElementsByTagName("tr") as $innerTrs)
      {
        foreach ( $innerTrs->getElementsByTagName('td') as $innerCell)
        {
            foreach ($innerCell->getElementsByTagName('a') as $a )
            {
               echo '<br><a href="'.GetMainBaseFromURL($url).$a->getAttribute('href').'">'.$a->nodeValue.'</a>';

              foreach ($a->getElementsByTagName('img') as $img )
                 echo '<br><a href="'.GetMainBaseFromURL($url).$a->getAttribute('href').'"> <img src="'.GetMainBaseFromURL($url).$img->getAttribute('src').'"></a>';
            }        
        }
      }
   }

   echo "</td>";  
  }
  echo "</tr>";
}
echo "</table>";

然后我如何使用php dom文件打印我的网页中的html表格。 我是php dom的新手。

谢谢。 非常感谢。

3 个答案:

答案 0 :(得分:2)

getElementsByTagName适用于整个文档。该文档有17个tr元素,因此无论放置在哪里,它都将返回所有元素。

由于您希望查找特定的tr元素,或者更具体地说是特定表格中的图像,我建议您让xpath执行大部分工作:

$xpath = new DOMXPath($xml);

$nodes =$xpath->query("//table[@id='machine']/tbody/tr/td/div/a/img");

echo 'Found ', $nodes->length, ":\n";

foreach($nodes as $node)
{
    $img = $node;
    $a = $node->parentNode;
    $aHref = $a->getAttribute('href');
    $imgSrc = $img->getAttribute('src');
    printf("Element:\n + href: %s;\n +- src: %s\n\n", $aHref, $imgSrc);
}

这将列出3个元素(不是2个)。您需要进一步确定要删除哪些,但这应该会使它更容易。 Demo&amp;输出:

Found 3:
Element:
 + href: /photos.php?id=7135&p=1;
 +- src: /class/class_Image.php?load=cGhvdG9zL0ExMTk0LmpwZ3wyNTB8MjUwfDF8

Element:
 + href: /photos.php?id=7135&p=2;
 +- src: /class/class_Image.php?load=cGhvdG9zL0ExMTk0XzEuanBnfDI1MHwyNTB8MXw=

Element:
 + href: /machine-print.php?id=7135;
 +- src: http://www.sterlingmachinery.com/images/quick_quote.jpg

另一个提示:首先将数据规范化为类似数组的结构。然后,您可以使用阵列生成输出。这样就可以将解析与输出分开,这将使您更容易实现目标。

  • 将文档解析为数组。
  • 在该数组中根据需要修改值(例如GetMainBaseFromURL)。
  • 根据数组生成输出。

答案 1 :(得分:1)

foreach循环迭代17只是因为你发布的HTML代码中有17个标签。 实际上$ rows = $ table-&gt; getElementsByTagName(“tr”);提取树中任意深度的任何标记。

要只获得两个外部,你可以做类似的事情

$ tbody = $ table-&gt; childNodes;

$ outerTr = $ tbody-&gt; childNodes;

$ outerTr

上的迭代

您还可以构建Xpath表达式以仅获取两个外部

我没有测试你的代码,但是在其他的foreach中,请记住getElementsByTagName(“tr”)(或其他标签td,a ..)的相同问题

答案 2 :(得分:1)

如果您只想复制表格,可以这样做:

<?php
$xml = new DOMDocument();
$xml->validateOnParse = true;
$xml->loadHTMLFile($url);

$table = $xml->getElementById('machine');
echo $xml->saveXML($table);
?>