如何通过 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.zip
和 eve.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')]
我想编写一个 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.zip
和 eve.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')]