本文讲解如何通过xpath表达式同时匹配id包含特定字符串和data-visible属性值为1的div元素,并准确提取其文本内容。
在Web数据抓取或DOM解析场景中,常需根据复合条件定位HTML元素。例如,目标是提取如下结构中
标签的文本内容(即“Need to extract”):Need to extract
该元素需同时满足两个条件:
以下两种写法均正确,语义等价且推荐使用:
//div[contains(@id, "line") and @data-visible="1"]
或分步逻辑更清晰的写法:
//div[contains(@id, "line")][@data-visible="1"]
? 解析说明: //div:从任意层级匹配 元素; contains(@id, "line"):检查 id 属性是否包含子串 "line"(适用于 line-10、line-20a 等动态ID); @data-visible="1":精确匹配 data-visible 属性值为字符串 "1"(注意XPath中属性值必须加引号,且区分大小写与类型——此处为字符串比较,非数值); and 连接表示同时满足,方括号 [] 为谓词,可链式叠加,增强可读性。
你原先的表达式:
'//*[contains(@id, "line")]//div[contains(@visible, "1")]'
存在三处关键问题:
$html = 'Need to extract';
$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
$nodes = $xpath->query('//div[contains(@id, "line") and @data-visible="1"]');
if ($nodes->length > 0) {
echo trim($nodes->item(0)->textContent); // 输出:Need to extract
}document.evaluate('//div[contains(@id,"line") and @data-visible="1"]', document).iterateNext()?.textContent掌握这种基于多属性联合筛选的XPath写法,能显著提升HTML结构化数据提取的准确性与鲁棒性。