带多个and contains的XPath为何无法提取同class a标签的目标链接?
你的XPath表达式没法正常提取的核心原因
第一个就是最容易踩的低级语法错
你写的表达式里,匹配ins链接的那段用了中文全角的左引号:contains(@href, “instagram.com"),那个“根本不是XPath认的英文半角引号"。这种情况大多是写表达式时输入法没切回英文状态,自己根本没察觉用了全角引号。
所有主流的XPath解析器碰到这种非法字符,会直接在语法校验阶段报错,后面的筛选条件根本不会正常生效,自然提不出想要的链接。
第二个是类名匹配的逻辑太死
你写的类名判断是@class="SK-FuGf",也就是要求class属性的值完完全全等于SK-FuGf才行。但看这个类名的格式,是典型的CSS-in-JS生成的随机哈希类名,实际网页里这种类名从来不会单独出现,一般都会和其他业务类名拼在同一个class里,比如<a class="footer_link SK-FuGf" href="xxx">。
这种情况下去做精确等值匹配,会直接漏掉所有目标a标签,很多人写爬虫时都栽在这一点上。
第三个是排除逻辑的边界有漏洞
就算把上面两个问题改了,你现在的排除条件也不一定能筛干净:
- 有些Instagram链接会用短链跳转,href本身根本不含
instagram.com字符串,会被当成官网链接错误保留 - 电话链接不一定严格是
tel:开头的格式,部分开发会在tel链接前面加其他前缀,可能漏排
改完能用的版本
把全角引号换成半角、把类名匹配改成包含判断后,基础可用的表达式是://a[contains(@class, "SK-FuGf") and not(contains(@href, "instagram.com")) and not(contains(@href, "tel:"))]/@href
实际用的时候可以根据页面的真实链接结构,补充对应的排除规则,避免把社交、电话链接错当成官网提出来。
内容的提问来源于stack exchange,提问作者Rob Popolizio
相关产品推荐
相关产品推荐

