简单 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:
中的错误很少
- 未关闭的标签
<div class="headertext">
。我想它应该在 <a href="log_out.php">Logout</a>
之后有关闭标签;
&
等实体应编码为 &
;
- 它可以被视为一个错误,但 PHP 无法识别
header
标签并发出警告。但是,它仍然可以成功加载 HTML 页面。
- 最后但同样重要的是,在使用
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 & 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
,然后使用 $rows
在 foreach()
中引用它。然后,你调用 ->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>
.
我正在尝试从我的 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:
中的错误很少- 未关闭的标签
<div class="headertext">
。我想它应该在<a href="log_out.php">Logout</a>
之后有关闭标签; &
等实体应编码为&
;- 它可以被视为一个错误,但 PHP 无法识别
header
标签并发出警告。但是,它仍然可以成功加载 HTML 页面。 - 最后但同样重要的是,在使用
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 & 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
,然后使用 $rows
在 foreach()
中引用它。然后,你调用 ->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>
.