【问题标题】:print html table using php dom document使用 php dom 文档打印 html 表格
【发布时间】:2011-11-18 10:55:22
【问题描述】:

需要帮助,

我想使用 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 的新手。

谢谢。 非常感谢。

【问题讨论】:

  • 什么不起作用?你有什么错误吗?
  • 没有得到错误,但它只打印内部 html 表格数据,不打印外部表格内部但内部 html 表格外部的外部数据。
  • 那我要写什么呢?第一个 tr 的数据未打印。
  • 我添加了一个答案,展示了如何通过使用 xpath 来获取您感兴趣的元素来显着减少代码。您所做的大部分遍历都不是必需的。希望对您有所帮助。

标签: php domdocument dom


【解决方案1】:

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 & 输出:

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)。
  • 根据数组生成输出。

【讨论】:

    【解决方案2】:

    foreach 循环迭代 17 次只是因为您发布的 HTML 代码中有 17 个标签。 实际上 $rows = $table->getElementsByTagName("tr");提取树中任意深度的任意标签。

    要只获得两个外部,您可以执行类似

    的操作

    $tbody = $table->childNodes;

    $outerTr = $tbody->childNodes;

    $outerTr 上的迭代

    你也可以构建一个Xpath表达式只获取两个外层

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

    【讨论】:

    • 谢谢 ab_dev86,您的友好沟通解决了我的问题 :)
    【解决方案3】:

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

    <?php
    $xml = new DOMDocument();
    $xml->validateOnParse = true;
    $xml->loadHTMLFile($url);
    
    $table = $xml->getElementById('machine');
    echo $xml->saveXML($table);
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 2019-04-13
      • 2011-11-13
      • 1970-01-01
      • 2012-07-20
      相关资源
      最近更新 更多