php - 在php中解析HTML表格

标签 php dom html-parsing html-parser

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

<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>

我想创建另一个数据库,其中包含卡路里脂肪碳水化合物蛋白质的单独列。 为了分离这些数据,我需要从旧数据库中获取数据并像这样解析它。

$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

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

例如,我希望在卡路里列中具有值178,在脂肪中具有0 g栏目等

最佳答案

尝试迭代 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 之间的文本每个元素都在一个文本节点中,并且不分隔,例如 <p>Calories (kcal)<br>Energy (kj)<br>...</p>将具有 Calories (kcal) 的文本节点和Energy (kj) ,不是Cal , ories ( , kcal)等等,它们可能没有标准化。

关于php - 在php中解析HTML表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16295379/

相关文章:

java - JSOUP 为 html 添加额外的编码内容

python - 用美汤刮痧

php - 查询结果的分页无法正常工作

javascript - 需要帮助使用 jQuery 和 javascript 制作实时可更新计时器

javascript - GSAP TweenLite 没有动画基本快速入门示例

javascript - 如何在 React 中将 HTML 字符串转换为虚拟 DOM?

javascript - 在 Appcelerator Titanium 中解析写得不好的 HTML

php - Bootstrap 3 下拉按钮高度和搜索

php - jquery ui 创建了很多不需要的跨度

javascript - 动态添加的 dom 元素不响应 jQuery 函数