如何通过 XPath 查询直接访问特定 HTML 链接

How to access specific HTML links directly via an XPath query

我想编写一个 XPath 查询,returns 来自 节点集的仅一部分 的链接。该集合在 //pre[2] 中,但对我来说它似乎不属于那里,因为很难干净地访问这些值。

可以使用以下代码将 html 文档导入 R。

library(XML)
doc <- htmlParse("http://www.retrosheet.org/game.htm", isURL = TRUE)

doc 具有这些属性,以及其他不相关的属性。

(s <- summary(doc)$nameCounts)[s > 1]
#
#   a   li   br   ul    b    p  pre   hr   h2 meta 
# 436   50   25   12    7    7    7    6    2    2  

我想收集所有以 eve.zip 结尾的 href 链接,但不收集 seve.zip 结尾的链接。我用下面的代码得到了想要的结果。但它看起来很笨重,我想看看我们是否可以改进它。

xx <- doc["//body/pre[2]/node()[text()]"]
m <- match("b", vapply(xx, xmlName, "")) - 1L
files <- basename(unlist(lapply(xx[1:m], xmlGetAttr, "href")))
summary(files)
#  Length     Class      Mode 
#      86 character character 

问题是 seve.zipeve.zip 在同一个节点集中,由 <br/> 分隔。我正在尝试获取所有 //pre/a/@href,以便该部分的名称为 "Regular Season Event Files"。但我不想要 "Regular Season Event Files by Decade" 部分。

我知道我可以使用 getHTMLLinks() 并删除不需要的链接,但我也想看看我是否也能学到一些新东西。

您可以使用contains()检查href属性值:

//body/pre[2]//a[contains(@href, "eve.zip") and not contains(@href, "seve.zip")]

使用 chrome 开发者工具进行了尝试 - 获得了 86 个链接。

如果您使用的是 XPath 2.0,您或许可以使用 end-with()

//body/pre[2]//a[ends-with(@href, 'eve.zip')]