简单 HTML DOM 解析不起作用

Simple HTML DOM parsing not working

我正在尝试从我的 html table 中提取电子邮件地址、姓名和 phone 号码,并使用这些详细信息发送自动电子邮件回复。

出于某种原因,我收到一个致命错误:Call to undefined function file_get_html() in http://itecdigital.org.uk/2015/430926/BeautyFactoryBooking/admin.php on line 3

我的 html Dom 解析器代码:

<?php

$html = file_get_html('http://itecdigital.org.uk/2015/430926/BeautyFactoryBooking/admin.php');

$dom = new DOMDocument();
$dom->loadHTML($html);

$elements = $dom->getElementsByTagName('tr');
//Loop through each row
foreach ($rows as $row) {
    //Loop through each child (cell) of the row
    foreach ($row->children() as $cell) {
        echo $cell->plaintext; // Display the contents of each cell - this is the value you want to extract
    }
}

?>

谁能看出这有什么问题?

我的html table代码如下:

<?php

        echo "<table style='border: solid 1px black;'>";
        echo "<tr><th>Id</th><th>First Name</th><th>Last Name</th><th>Email Address</th><th>Phone Num</th><th>Treatment</th><th>Date</th><th>Time</th><th>Message</th><th>Reply</th></tr>";

        class TableRows extends RecursiveIteratorIterator {
            function __construct($it) {
                parent::__construct($it, self::LEAVES_ONLY);
            }

            function current() {
                return "<td style='width:100px;border:1px solid black;'>" . parent::current(). "</td>";
            }

            function beginChildren() {
                echo "<tr>";
            }

            function endChildren() {
                echo "</tr>" . "\n";
            }
        }

        $servername = "#";
        $username = "#";
        $password = "#";
        $dbname = "#";

        try {
            $conn = new PDO("mysql: host=$servername; dbname=$dbname", $username, $password);
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $stmt = $conn->prepare("SELECT Booking_request_form.id_booking, Client_Information.first_name, Client_Information.last_name, Client_Information.email_address, Client_Information.phone_number, Booking_request_form.treatment, Booking_request_form.date, Booking_request_form.time, Booking_request_form.message FROM Booking_request_form INNER JOIN Client_Information WHERE Client_Information.id_client=Booking_request_form.client_fk"); 

            $stmt->execute();

            // set the resulting array to associative
            $result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
            foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) {
                echo $v;
            }
        }

        catch(PDOException $e) {
            echo "Error: " . $e->getMessage();
        }

        $conn = null;
        echo "</table>";

?> 

有没有简单的解决方法?

使用 file_get_contents 函数代替 file_get_html。 PHP.

中没有这个函数file_get_html

然而,HTML:

中的错误很少
  1. 未关闭的标签<div class="headertext">。我想它应该在 <a href="log_out.php">Logout</a> 之后有关闭标签;
  2. & 等实体应编码为 &amp;
  3. 它可以被视为一个错误,但 PHP 无法识别 header 标签并发出警告。但是,它仍然可以成功加载 HTML 页面。
  4. 最后但同样重要的是,在使用 DOMElement 属性时存在一些错误。

我已经重写了您的代码以向您展示它是如何工作的:

<?php

$html = file_get_contents('http://itecdigital.org.uk/2015/430926/BeautyFactoryBooking/admin.php')

$dom = new DOMDocument();
$result = $dom->loadHTML($html, LIBXML_NOERROR);
var_dump($result);
$elements = $dom->getElementsByTagName('tr');
//Loop through each row
var_dump($elements);
foreach ($elements as $row) {
    //Loop through each child (cell) of the row
    foreach ($row->childNodes as $cell) {
        echo $cell->nodeValue; // Display the contents of each cell - this is the value you want to extract
    }
}


?>

和 HTML 应该是这样的:

<!DOCTYPE html>
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      <meta http-equiv="X-UA-Compatible" content="chrome=1,IE=edge" />
      <title>Beauty Factory Bookings</title>
      <link href='http://fonts.googleapis.com/css?family=Montserrat:400,700' rel='stylesheet' type='text/css'>
   </head>
   <body>
      <img action="login_success.php" src="http://i.imgur.com/wbhPNAs.png" style="width: 240px; height:35px;"> 
      <header>
         <div class="headertext"> <a href="booking.php">Book Appointment</a> <a href="about.php">About Us</a> <a href="contact.php">Contact Us</a> <a href="log_out.php">Logout</a></div>
      </header>
      <table style='border: solid 1px black;'>
         <tr>
            <th>Id</th>
            <th>First Name</th>
            <th>Last Name</th>
            <th>Email Address</th>
            <th>Phone Num</th>
            <th>Treatment</th>
            <th>Date</th>
            <th>Time</th>
            <th>Message</th>
            <th>Reply</th>
         </tr>
         <tr>
            <td style='width:100px;border:1px solid black;'>1</td>
            <td style='width:100px;border:1px solid black;'>Filip</td>
            <td style='width:100px;border:1px solid black;'>Grebowski</td>
            <td style='width:100px;border:1px solid black;'>grebowskifilip@gmail.com</td>
            <td style='width:100px;border:1px solid black;'>07449474894</td>
            <td style='width:100px;border:1px solid black;'>Waxing - Full Leg &amp; Bikini</td>
            <td style='width:100px;border:1px solid black;'>11/03/2016</td>
            <td style='width:100px;border:1px solid black;'>10:20</td>
            <td style='width:100px;border:1px solid black;'>Is this okay?</td>
         </tr>
         <tr>
            <td style='width:100px;border:1px solid black;'>2</td>
            <td style='width:100px;border:1px solid black;'>Filip</td>
            <td style='width:100px;border:1px solid black;'>Grebowski</td>
            <td style='width:100px;border:1px solid black;'>grebowskifilip@gmail.com</td>
            <td style='width:100px;border:1px solid black;'>07449474894</td>
            <td style='width:100px;border:1px solid black;'>Anti-Age Facial</td>
            <td style='width:100px;border:1px solid black;'>01/01/1970</td>
            <td style='width:100px;border:1px solid black;'>10:20</td>
            <td style='width:100px;border:1px solid black;'>Is this ok????</td>
         </tr>
      </table>
   </body>
   <style> table { margin-top: 60px; border-collapse: collapse; margin-left: auto; margin-right: auto; margin-bottom: 60px; } tr:nth-child(even) { background-color: #f2f2f2 } th, td { padding: 15px; } img { padding-top: 12px; padding-left: 12px; } .headertext { float: right; padding-top: 20px; padding-right: 3%; } body { background: url('#') no-repeat fixed center center; background-size: cover; font-family: 'Montserrat', sans-serif; margin: 0; padding: 0; } header { background: black; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; filter: alpha(opacity=80); -moz-opacity: 0.8; -khtml-opacity: 0.8; opacity: 0.7; height: 60px; font-family: 'Montserrat', sans-serif; } a:link { font-size: 15px; margin-left: 75px; color: white; background-color: transparent; text-decoration: none; } a:visited { font-size: 15px; margin-left: 75px; color: white; background-color: transparent; text-decoration: none; } a:hover { font-size: 15px; margin-left: 75px; color: #C0C0C0; background-color: transparent; text-decoration: none; } </style>
</html>

你的 HTML 应该有一个合适的 HTML 结构,而不仅仅是 table:

<!DOCTYPE html>
<html>
<body>
    <?php
        echo "<table style='border: solid 1px black;'>";
        /* etc */
    ?>
</body>
</html>

此外,请确保在 PHP 输出中正确关闭标签。


*编辑*

我刚刚研究了 Simple HTML DOM。

确保在您的代码中包含库文件:include("/path/to/simple_html_dom.php");

此外,对于简单 HTML DOM,您不需要将 $html 加载到 DOM 文档。简单地说

$html = file_get_html('http://itecdigital.org.uk/2015/430926/BeautyFactoryBooking/admin.php');

$elements = $html->find('tr');

请阅读 PHP 简单 HTML DOM 解析器手册以获取更多信息。

您混合使用 Simple HTML Dom third part class commands (as per your question title) with DOMDocument built-in class 命令,因此您的代码无法运行。

file_get_html()是一个简单的HTMLDom函数,用file_get_contents():

代替
$html = file_get_contents( '/Users/sam/Downloads/trash.html' );

$dom = new DOMDocument();
libxml_use_internal_errors( 1 );      // <-- add this line to avoid DOM errors
$dom->loadHTML( $html );

$elements = $dom->getElementsByTagName('tr');

现在,初始化一个数组 ($rows) 以填充单元格值和一个整数字符串 ($cols) 作为列号;您的 HTML 格式错误,此变量将帮助您生成 well-formed table:

$rows = array();
$cols = 0;

在您的代码中还有另一个错误:您将 <tr> 放入 $elements,然后使用 $rowsforeach() 中引用它。然后,你调用 ->children() 方法遍历所有 children,但是 DOMElement 没有这个方法,使用 ->childNodes 属性反而。但是,首先,检查行列号并更新先前声明的变量 $cols。在嵌套 foreach() 中,您将单元格值添加到 $rows。您稍后会显示。要检索 DOMNode 的值,请使用 ->nodeValue 而不是 ->plaintext。我用 trim() 包装了 $cell->nodeValue 以删除字符串 begin/end 处的额外空格:

foreach ($elements as $key => $row)
{
    if( $row->childNodes->length > $cols ) $cols = $row->childNodes->length;
    foreach( $row->childNodes as $cell )
    {
        $rows[$key][] = trim( $cell->nodeValue );
    }
}

现在,您在多维数组 $rows 中有了单元格值。


Table显示

你的显示table的代码不是你的代码,它是来自net的copy-and-paste:它无关有你的问题,你可以忽略它。

改用像这样的简单代码:

echo "<table>\n";
echo "    <tr>\n";
for( $j = 0; $j < $cols; $j++ ) echo "        <th>{$rows[0][$j]}</th>\n";
echo "    </tr>\n";
for( $i = 1; $i < count($rows); $i++ )
{
    echo "    <tr>\n";
    for( $j = 0; $j < $cols; $j++ )
    {
        if( isset( $rows[$i][$j] ) ) echo "        <td>{$rows[$i][$j]}</td>\n";
        else                         echo "        <td></td>\n";
    }
    echo "    </tr>\n";
}
echo "</table>\n";

这只是一个工作示例,请根据需要修改 HTML 代码。您还可以更改单元格的顺序。注意打印 table header 和打印 table 行之间的不同代码(for() 循环从 1 开始)。还要注意 $cols 的用法:如果一个单元格为空,我们输出一个空的 <td>.