为什么在这个XPath查询 `/div[a="Download"]/a/@href` 中需要重复HTML属性a?
xidel 'https://softwarefoundations.cis.upenn.edu/vfa-current/index.html' -e '//div[@id="button_block"]/div[a="Download"]/a/@href'
工作正常,不过
xidel 'https://softwarefoundations.cis.upenn.edu/vfa-current/index.html' -e '//div[@id="button_block"]/div["Download"]/a/@href'
却会打印出两个
xidel 'https://softwarefoundations.cis.upenn.edu/vfa-current/index.html' -e '//div[@id="button_block"]/div[a="Download"]/@href'
一个也不打印。
这些实验表明XPath语法的表现与我预期的不同:不过,是否有人能解释为什么我还不得不重复指定 a 属性,以及是否存在一种(稍微)更紧凑的写法?这让我有点摸不着头脑。
附言:多亏了 https://stackoverflow.com/a/46902091/22133250 的示例,我才找到了可用的语法,否则我想我会很难通过纯粹的逻辑推理和查阅XPath规范来得到这个解法。
解决方案
div[a="Download"]/a/@href
对于每个拥有元素 <a ...>Download</a>(带任意属性)的 <div/>,返回所有 <a href="..."/> 属性的值。
读起来你似乎只需要下载链接(URL),你可能会查找
div/a[.="Download"]/@href
也就是说,对于每个 <div/>,对于其文本值为 Download 的每个 <a/> 子元素,返回其 @href 属性。
两者的区别在于你的输入是
<div>
<a href="https://download.example.com/">Download</a>
<a href="https://www.example.com/">Home</a>
</div>
<div>
<a href="/help">Help</a>
</div>
第一个表达式会匹配第一个 <div/>,因为它包含一个“download”链接,并返回两个URL。第二个表达式将专门匹配 <a>Download</a> 元素并返回它的URL。两者都不会匹配第二个URL。
在你的示例中:
div["Download"]/...返回一个文本为 "Download" 的<div/>元素(如果只有一个链接且没有其他带文本的内容,它也可能会工作)。div[a="Download"]/@href查找位于<div/>元素自身的href属性,而不是子元素的属性。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。