使用正则表达式从html页面提取数据

时间:2017-08-26 18:18:39

标签: r

我觉得我在这里非常接近解决方案,但似乎无法弄清楚为什么我没有得到任何结果。我有一个html页面,我正在尝试从中解析出一些ID。我99%肯定我的正则表达式代码是正确的,但由于某种原因我没有得到任何输出。

在html源代码中,有许多id包含文本,如:/ boardgame / 9999 / asdf。我的正则表达式代码应该取出/ 9999 /位,但我无法弄清楚为什么它只是返回我输入的相同输入html字符串。

library(RCurl)
library(XML)
url <- sprintf("https://boardgamegeek.com/browse/boardgame/page/1")
html <- getURL(url, followlocation = TRUE)
id.parse <- sub("boardgame(.*?)[a-z]", "\\1", html)

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我认为你的模式并不准确。在这种情况下,您还会选择其他单词,从“桌面游戏”开始。 这适用于一个ID。

id.pos <- regexpr("boardgame/[[:digit:]]{3,10}/[a-z]", html)
my.id <- substr(html, id.pos, id.pos + attributes(id.pos)$match.length)
gsub("(^[[:alpha:]]*/)|(/[[:alpha:]]*$)", "", my.id)

在我手中,它返回:

[1] "226501"

另外,我在这个html页面中找到了很多ID。要在一个列表中捕获它们,您可以执行以下操作。

url <- sprintf("https://boardgamegeek.com/browse/boardgame/page/1")
html <- getURL(url, followlocation = TRUE)
id.list <- list()
while (regexpr("boardgame/[[:digit:]]{3,10}/[a-z]", html) > 0) {
  id.pos <- regexpr("boardgame/[[:digit:]]{3,10}/[a-z]", html)
  my.id <- substr(html, id.pos, id.pos + attributes(id.pos)$match.length)
  id.list[[(length(id.list) + 1)]] <- gsub("(^[[:alpha:]]*/)|(/[[:alpha:]]*$)", "", my.id)
  html <- substr(html, (id.pos + attributes(id.pos)$match.length), nchar(html))
}
id.list