如何编写不依赖固定位置的XPath,避免爬虫数据提取错误
问题:基于固定位置的XPath因顺序变化导致提取错误,如何优化?
我在爬虫提取数据时用了依赖
//div[@class="info"]/div[1]/div[1]/div[1]/div[1]/ul[1]/li[2]
原本用来提取Thickness(厚度)值,但目标
<div class="info"> <div class="accordion additional-info info__block" > <h5 class="accordion__header additional-info__header info__header"> Product details</h5> <div class="accordion__content additional-info__content info__content" > <div class="info-content" id="product-details"> <div class="info__lists"> <ul class="info__lists-not-bullets"> <li><strong>Length:</strong> 3600 mm</li> <li><strong>Thickness:</strong> 45 mm</li> <li><strong>Width:</strong> 95 mm</li> <li><strong>Thickness Imperial:</strong> 1 3/4in</li> <li><strong>Width Imperial:</strong> 3 3/4in</li> </ul>
解决方案
不要依赖
1. 精准匹配标签文本
直接定位包含Thickness:文本的<strong>所在的<li>,这是最可靠的写法:
//div[@class="info"]//ul[@class="info__lists-not-bullets"]/li[strong[text()="Thickness:"]]
提取数值时,可以直接取该<li>的文本内容(注意过滤掉<strong>部分的文本和空白字符),或者用下面的XPath直接获取数值部分的文本:
//div[@class="info"]//ul[@class="info__lists-not-bullets"]/li[strong[text()="Thickness:"]]/text()
2. 模糊匹配文本(应对文本细微变化)
如果<strong>内的文本偶尔有空格或格式差异,比如写成Thickness :,可以用contains做模糊匹配:
//div[@class="info"]//ul[@class="info__lists-not-bullets"]/li[strong[contains(text(),"Thickness:")]]
注意:如果直接匹配Thickness,可能会误命中Thickness Imperial:,所以尽量带上冒号提升精准度。
3. 简化原有XPath层级(次选方案)
原XPath里的div[1]层级冗余且脆弱,即使仍用位置定位,也可以简化层级降低出错概率:
//div[@class="info"]//ul[@class="info__lists-not-bullets"]/li[2]
但这种写法还是依赖位置,优先级低于前面两种内容匹配的方式。
内容的提问来源于stack exchange,提问作者user22228425
相关产品推荐
相关产品推荐

