使用 stringr 解析网页

Parsing a web page with stringr

我有这个项目,我试图从网页中提取数字。下面是我尝试解析的文本示例。

"\naAreas = [\n[107447478,2490,1925,559,1016,962,0,18,0,1,110,],\n[107447440,2366,1800,565,1033,811,1,46,0,0,23,],\n[107447521,2933,2396,543,921,1566,0,11,0,0,115,]\n];\naRoutes = [\n];\n$(function() {\n $(\".typeTip\").attr(\"title\", \"T=Trad, S=Sport, TR=Toprope\");\n showTips();\n});\n"

我要查找粗体数字,所以“\n[”和“,”之间的任何数字。我正在尝试使用 R 中的 stringr 包来执行此操作,但我对正则表达式并不是很熟悉,所以我要删除了。

这个有效:

x <- "\naAreas = [\n[107447478,2490,1925,559,1016,962,0,18,0,1,110,],\n[107447440,2366,1800,565,1033,811,1,46,0,0,23,],\n[107447521,2933,2396,543,921,1566,0,11,0,0,115,]\n];\naRoutes = [\n];\n$(function() {\n $(\".typeTip\").attr(\"title\", \"T=Trad, S=Sport, TR=Toprope\");\n showTips();\n});\n"

stringr::str_extract_all(x, '(?<=\n\[)\d+')
## [[1]]
## [1] "107447478" "107447440" "107447521"

(?<=\n\[) 是一个回顾,并说确保继续进行新行和方括号,但不要捕获它们。 \d+ 表示尽可能多地获取数字,直到没有更多数字为止。

如果你只想捕获数字,你可以试试这个:

(?:\n\[)(\d+)

stringr 基于 stringi。这是使用 stringiV8 的不同方法,因为你在那里有 javascript:

library(V8)
library(stringi)

js <- "\naAreas = [\n[107447478,2490,1925,559,1016,962,0,18,0,1,110,],\n[107447440,2366,1800,565,1033,811,1,46,0,0,23,],\n[107447521,2933,2396,543,921,1566,0,11,0,0,115,]\n];\naRoutes = [\n];\n$(function() {\n $(\".typeTip\").attr(\"title\", \"T=Trad, S=Sport, TR=Toprope\");\n showTips();\n});\n"

ctx <- v8()

我们必须删除 jQuery 位,因为 V8 无法处理这些位,但是一旦我们这样做了,我们就可以将其计算为 javascript:

ctx$eval(sprintf("var %s ", paste0(stri_split_lines(js)[[1]][2:6], collapse="\n")))

然后获取数据:

ctx$get("aAreas")
##           [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
## [1,] 107447478 2490 1925  559 1016  962    0   18    0     1   110
## [2,] 107447440 2366 1800  565 1033  811    1   46    0     0    23
## [3,] 107447521 2933 2396  543  921 1566    0   11    0     0   115

或者,只是我们想要的位:

ctx$get("aAreas")[,1]
## [1] 107447478 107447440 107447521