使用simple_html_dom解析HTML表

时间:2018-02-12 04:32:42

标签: php html mysql parsing

我正在抓取以下html表:

<table>
 <tr>
  <td class="Name">A</td>
  <td class="S1">5</td>
  <td class="S2">6</td>
 </tr>
</table>

我的目标是使用Html_simple_dom来解析数据并将值输入MySQL数据库。这是我到目前为止所做的:

<?php
include('../simple_html_dom.php');
include('dbconnect.php');
$html = file_get_html('url');
$table = $html->find('table');
foreach ($table->find('tr') as $row) {
 foreach ($row->find('td[class=Name]') as $cell) {
  $name = $cell->plaintext;
  }
}

我遇到的问题是我的$ name变量实际上是一个数组。如果我这样做,我就会遇到重复的问题:

foreach ($table->find('tr') as $row) {
 foreach ($row->find('td[class=Name]') as $cell) {
  }
  $name = $cell->plaintext;
}

我的最终目标是MySQL查询,例如:

$sql = Insert into ScoreTable (Score1, Score2)
       Values ($S1, $S2)
       Where PName = $Name

但是当我“找到”时,我无法分离我得到的数组值,我甚至无法将html元素分离为变量。我哪里错了?

编辑:修正了我的目标。

2 个答案:

答案 0 :(得分:1)

如果只需要一个值,则不需要使用cicly。您可以获取返回数组的第一个元素或使用find()

的第二个参数

请参阅此处http://simplehtmldom.sourceforge.net/manual.htm

  

//查找第(N)个锚点,返回元素对象,如果未找到则返回null(基于零)

     

$ ret = $ html-&gt; find('a',0);

您的MYSQL插入格式错误,请参阅https://dev.mysql.com/doc/refman/5.7/en/insert.html正确

  

INSERT INTO ScoreTable(Score1,Score2,Pname)VALUES('$ S1','$ S2','$ name')

我不知道你在“dbconnect.php”中。但如果有类似“$ mysqli = mysqli_connect”的内容,那么您的代码就是

foreach ($table->find('tr') as $row) {
   $name =$row->find('td.Name',0)->plaintext;
   $S1 =$row->find('td.S1',0)->plaintext;
   $S2 =$row->find('td.S2',0)->plaintext;
   if (!is_null($name)) { // if found name
          $name=$mysqli->real_escape_string($name); // Escapes special characters
          $S1=$mysqli->real_escape_string($S1);
          $S2=$mysqli->real_escape_string($S2);

         if ($mysqli->query("INSERT INTO ScoreTable (Score1, Score2, Pname) VALUES ('$S1', '$S2','$name')") === TRUE) {//Make SQL query and check is it success
                echo "Sccess\n";
         }
   }

}

检查你的dbconnect.php和过去所需的链接到连接变量,而不是$ mysqli

另外,我们建议使用real_escape_string()来转义特殊字符。特别是如果您使用外部数据。

答案 1 :(得分:0)

我不知道这是否是最好的答案,但它有效:

从网站上删除的HTML表格:

<table>
 <tr>
  <td class="Name">A</td>
  <td class="S1">5</td>
  <td class="S2">6</td>
 </td>
</table>

我最终为我正在抓取的每个类创建一个数组,将它们组合成一个数组,然后从合并数组中更新数据库:

<?php
include("connect.php");
include("simple_html_dom.php");
$html = file_get_html('url', TRUE);

$table = $html->find('table',0);
foreach($table->find('tr') as $row){

$g_name = array()
foreach($row->find('td[class=Name]') as $cell{
 $g_name['Name'] = $cell->plaintext;
}

$g_s1 = array()
foreach($row->find('td[class=S1]') as $cell{
 $g_s1['S1'] = $cell->plaintext;
}

$g_s2 = array()
foreach($row->find('td[class=S2]') as $cell{
 $g_s2['S2'] = $cell->plaintext;
}

$data = array_merge($g_name,$g_s1,$g_s2);
$sql = "Update table SET
Rd1='".$data['S1']."',
Rd2='".$data['S2']."',
WHERE Player = '".$data['Name']."';

}
?>

然后关闭我的MySQL连接或显示错误等... 我不确定这是否是最好的方法,但它正在发挥作用。

感谢大家的帮助。