【问题标题】:Parse HTML table in php在 php 中解析 HTML 表格
【发布时间】:2013-04-24 02:34:01
【问题描述】:

我有一个数据库表,它在一列中包含以下格式的数据。

<table cellspacing="1" cellpadding="0" border="0" width="395">
    <tbody>
        <tr>
            <td valign="top" width="135">
                <p>Calories (kcal)<br>Energy (kj)<br>Fats<br>Carbohydrates<br>Protein<br></p>
            </td>
            <td valign="top">
                <p>178<br>748<br>0 g<br>9.6 g<br>0.1 g<br></p>
            </td>
            <td valign="top" width="135">
                <p>Fiber<br>Sugars<br>Cholesterol<br>Sodium<br>Alcohol<br></p>
            </td>
            <td valign="top">
                <p>0 g<br>-<br>0 mg<br>-<br>26.2 g<br></p>
            </td>
        </tr>
    </tbody>
</table>

我想创建另一个数据库,其中有 CaloriesFatsCarbohydratesProtein 的单独列。 为了分离这些数据,我需要从旧数据库中获取数据并像这样解析它。

$qry = "SELECT * FROM table";
$res = $mysqli->query($qry);

// new dom object
$dom = new DOMDocument();

while ($row = $res->fetch_assoc()) {

    $html = @$dom->loadHTML($row['columndata']);
    //the table by its tag name
    $tables = $dom->getElementsByTagName('table');
    $rows = $tables->item(0)->getElementsByTagName('tr');

    foreach ($rows as $row)
    {
        $cols = $row->getElementsByTagName('td');
        echo $cols->item(0)->nodeValue.'<br />';
        echo $cols->item(1)->nodeValue.'<br />';
    }
}

这会输出以下内容:

Calories (kcal)Energy (kj)FatsCarbohydratesProtein  
1787480 g9.6 g0.1 g

我无法分离输出字符串以在新数据库中具有正确的列值。

例如,我想在Calories 列中具有值178,在Fats 列中具有0 g 等。

【问题讨论】:

  • parse the data based on the HTML tag 是什么意思??
  • 你想要什么输出?
  • nodeValue 删除所有标签,你想要像 Javascript 的 innerHTML 这样的东西。 DOMDocument API 没有这个,你需要自己写。在 php.net/manual/en/class.domelement.php 的 cmets 中有一个简单的 get_inner_html 函数
  • 我修改了问题,添加了我需要的作为示例

标签: php dom html-parsing html-parser


【解决方案1】:

尝试遍历P 元素的子节点:

foreach ($rows as $row)
{
    $paragraphs = $row->getElementsByTagName('p');
    //ensure that all the text between <br> is in one text node
    $paragraphs->item(0)->normalize();
    foreach($paragraphs->item(0)->childNodes as $node) {
        if ($node->nodeType == XML_TEXT_NODE) {
            echo $node->nodeValue . '<br/>;
        }
    }

}

p 元素上调用 normalize() 很重要,以确保br 元素之间的文本每个都在一个文本节点中,并且不分开,例如&lt;p&gt;Calories (kcal)&lt;br&gt;Energy (kj)&lt;br&gt;...&lt;/p&gt; 将具有@987654326 的文本节点@ 和 Energy (kj),而不是 Calories (kcal) 等等,它们可能没有规范化。

【讨论】:

  • 感谢@SWilk 的帮助,我能够完成这项工作。
【解决方案2】:

如果你想获取 td 元素的 innerHTML,你可以使用以下构造:

$tdElement = $row->getElementsByTagName('td')->item(0);
$tdElement->ownerDocument->saveHTML( $tdElement );

它应该以 string 的形式返回该节点的内部 html。

【讨论】:

    猜你喜欢
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 2013-01-02
    • 1970-01-01
    • 2016-09-20
    • 2016-05-17
    • 1970-01-01
    相关资源
    最近更新 更多