【问题标题】:HTML Table parsing using DOM使用 DOM 解析 HTML 表
【发布时间】:2013-07-17 04:02:00
【问题描述】:

我有一个 HTML 表格

我的解析代码是

$src = new DOMDocument('1.0', 'utf-8');
$src->formatOutput = true;
$src->preserveWhiteSpace = false;
@$src->loadHTML($result);
$xpath = new DOMXPath($src);
$data=$xpath->query('//td[ contains (@class, "bodytext1") ]');
foreach($data as $datas)
{
echo $datas->nodeValue."<br />";
}
$values=$xpath->query('//tr[ contains (@bgcolor, "f3fafe") ]');
foreach($values as $value)
{
echo $value->nodeValue."<br />";
}
$values1=$xpath->query('//tr[ contains (@bgcolor, "def0fa") ]');
foreach($values1 as $value1)
{
echo $value1->nodeValue."<br />";
}

要打印,我希望它们与我需要的输出中显示的其他行一起重复。 我想把这整件事放在一个数组中,这样我就可以将它插入数据库中

谁能指导我或给我任何提示,以便我可以做到这一点

【问题讨论】:

  • 你在哪里加载 HTML?
  • 我的 html 在 $result 中
  • 对于前两个搜索,您需要提取 nodeValues,从中提取您需要的数据,并将其存储在变量中。然后,在第三次搜索时,打印每一行,以及您在前两次搜索中提取的数据。如果没有要查看的 HTML,很难精确,而且我无法访问您的 Gist - 将其发布在这里..
  • @MikeW 我的 HTML 在这里 gist.github.com/anonymous/5592ff3ee08224f8f4ab & 我在这里将它分配给 $result
  • @MikeW 问题已编辑先生,请看一下,请帮我先生

标签: php html parsing dom html-parsing


【解决方案1】:

这应该让你开始。

$src = new DOMDocument('1.0', 'utf-8');
$src->formatOutput = true;
$src->preserveWhiteSpace = false;
$src->loadHTML($result);
$xpath = new DOMXPath($src);

// get header data
$data=$xpath->query('//table[1]//td');

$htno = trim(explode(":",$data->item(0)->nodeValue)[1]);
$name = trim(explode(":",$data->item(1)->nodeValue)[1]);
$fatherName=trim(explode(":",$data->item(2)->nodeValue)[1]);

// rows from 2nd table 
$values1=$xpath->query('//table[2]//tr');
$header = true;  // flag to track whether we've read the header row.
foreach($values1 as $value1)
{
if (!$header) {
  $rowdata = str_replace("\r\n"," ",$value1->nodeValue);
  echo $htno," ",$name," ",$fatherName," ",$rowdata,"\n";
}
$header = false;
}

注意:

  • $header 标志是一个快速修复。更好的 Xpath 查询可能会消除对它的需求。
  • 底部附近的str_replace 很丑但很方便。您可能想尝试一下xpath 查询,看看您是否可以改进它。
  • 输出未针对 HTML 格式化 - 行由 \n 分隔
  • 我在包含&amp; 的一行收到警告,因此我将其更改为AND。您可能需要对表格进行预处理以以某种方式消除这些表格。

【讨论】:

  • 出现解析错误:语法错误,$htno = trim(explode(":",$data->item(0)->nodeValue)[1]) 的意外'[';这条线先生
  • PHP 的哪个版本?这适用于 PHP5.4 尝试将表达式分解为:$temp = explode(":",$data-&gt;item(0)-&gt;nodeValue); $htno = trim($temp[1]);。您可能也需要对其他线路执行此操作。
  • 非常感谢先生 :)
  • 在使用 echo 打印时,它会打印所有 8 行,但在将其插入数据库表时,只插入第一行
  • 那么您为更新数据库而编写的代码有问题。问一个新问题。
【解决方案2】:

您可以使用第三方的 dll,例如“Html Agility Pack”。一款专业的html转xml工具。

【讨论】:

    猜你喜欢
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多