You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DOMXPath查询报错求助:获取指定页面板块下表格4行内容

解决DOMXPath查询IBGE页面表格内容的问题

嘿,我来帮你搞定这个DOMXPath的难题!你之前直接指定12个<tr>标签的思路太宽泛了,页面里可能有很多表格的行,没有限定到TERRITÓRIO E AMBIENTE这个板块,所以才会出错。咱们换个精准的方式来定位目标内容:

步骤1:初始化DOM和XPath,处理网页解析警告

首先,网页源码可能存在不规范的地方,先开启错误忽略避免解析失败:

libxml_use_internal_errors(true); // 忽略HTML解析时的警告
$html = file_get_contents('https://cidades.ibge.gov.br/brasil/sp/sao-paulo/panorama');
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);

步骤2:编写精准的XPath定位语句

核心是先找到TERRITÓRIO E AMBIENTE板块,再定位它下面的表格行。根据页面结构,我们可以这样写:

// 先定位到标题所在的元素,再找它后续的表格行
$targetRows = $xpath->query("//h3[contains(normalize-space(text()), 'TERRITÓRIO E AMBIENTE')]/following-sibling::div[contains(@class, 'conteudo')]//table/tbody/tr");

这里的逻辑是:

  • 找到包含目标标题的<h3>标签(如果实际页面是<h2>或其他标签,你可以根据开发者工具的检查结果调整)
  • 定位到标题后面的内容容器(带conteudo类的div)
  • 再深入到表格的<tbody>里取数据行,这样就能自动跳过表头行

步骤3:遍历获取目标4行内容

现在你可以遍历查询结果,提取前4行数据:

if ($targetRows->length > 0) {
    $rowCount = 0;
    foreach ($targetRows as $row) {
        if ($rowCount >= 4) break; // 只取前4行
        $cells = $xpath->query('.//td', $row);
        $rowData = [];
        foreach ($cells as $cell) {
            $rowData[] = trim($cell->nodeValue);
        }
        print_r($rowData); // 输出每行的内容
        $rowCount++;
    }
} else {
    echo "未找到目标板块的表格行";
}

// 清理错误缓存
libxml_clear_errors();

关键提示

如果页面结构有变动(比如标签类名、标题层级改变),你可以用浏览器开发者工具(F12)右键目标元素,选择「复制XPath」来快速生成基础路径,再调整成更通用的写法(比如用contains()代替精确匹配,避免因空格或细微文本变化失效)。

内容的提问来源于stack exchange,提问作者Gislef

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:20:31