PHP实现HTML表格转JSON:解决链接与名称获取异常问题
解决方案
咱们来一步步修复你的代码问题,搞定这三个核心痛点:过滤无效的表头数据、正确抓取用户链接、清理名称里的多余空白。
问题拆解与修复思路
- 剔除表头行:你现在遍历了所有
<tr>元素,连<thead>里的表头也混进去了,这才导致无效数据出现。咱们得只处理<tbody>里面的内容行。 - 正确获取用户链接:你之前拿到的是
DOMNodeList对象,不是实际的链接地址,得从<a>标签里提取href属性值。目标列里有两个<a>,它们的href是一样的,取第二个(带用户名的那个)更直观。 - 清理名称的多余空白:直接用
textContent会带上HTML里的换行和空格,要么提取第二个<a>的文本,要么用trim()函数把多余空白清掉。
修改后的完整PHP代码
header("Access-Control-Allow-Origin: *"); header('Content-Type: application/json'); error_reporting(E_ERROR | E_PARSE); $time_start = microtime(true); $allUsers = []; $link = 'http://rudraproduction.in/htmltable.php'; $htmlContent = file_get_contents($link); $dom = new DOMDocument; // 忽略HTML解析警告,避免页面结构不规范导致报错 libxml_use_internal_errors(true); $dom->loadHTML($htmlContent); libxml_clear_errors(); // 定位目标表格和tbody $tables = $dom->getElementsByTagName('table'); $targetTable = $tables->item(0); $tbody = $targetTable->getElementsByTagName('tbody')->item(0); $rows = $tbody->getElementsByTagName('tr'); foreach ($rows as $row) { $cells = $row->getElementsByTagName('td'); // 处理第一列:提取用户链接和名称 $nameCell = $cells->item(0); $linkElements = $nameCell->getElementsByTagName('a'); $userLink = $linkElements->item(1)->getAttribute('href'); $name = $linkElements->item(1)->textContent; // 处理其他字段,用trim清理多余空白 $height = trim($cells->item(1)->textContent); $weight = trim($cells->item(2)->textContent); $date = trim($cells->item(3)->textContent); $info = trim($cells->item(4)->textContent); // 提取国家文本 $country = $cells->item(5)->getElementsByTagName('a')->item(0)->textContent; $allUsers[] = [ "user_link" => $userLink, "name" => $name, "height" => $height, "weight" => $weight, "date" => $date, "info" => $info, "country" => $country ]; } echo json_encode($allUsers, JSON_PRETTY_PRINT);
关键修改说明
- 添加HTML错误抑制:用
libxml_use_internal_errors(true)忽略页面可能存在的格式不规范警告,避免解析失败。 - 精准定位内容行:只遍历
<tbody>内的<tr>,彻底排除表头数据。 - 直接提取目标元素:从指定
<a>标签获取链接和名称,既避免了空白问题,又拿到了正确的链接值。 - 统一清理空白:对所有文本字段使用
trim(),确保输出数据干净整洁。
这样调整后,输出的JSON就完全符合你的预期啦。
内容的提问来源于stack exchange,提问作者Chauhan Ajay
相关产品推荐
相关产品推荐

