我想从R中的HTML文件中提取数据。我有一个具有以下结构的大文件:
a <- "</span>Cabildo \t456\t386\t70\t21\t4\t101\t36\t12\t88\t48\t84\t62\t-</p></td></tr><tr><td colspan=\"14\" bgcolor=\"#CCDDE7\"><p class=\"s3\" style=\"padding-top: 1pt;padding-left: 5pt;text-indent: 0pt;text-align: left;\"><span style=\" color: black; font-style: normal; font-weight: normal;\"></span>Sierra Gorda\t106 \t89 \t17 \t-\t-\t26 \t9 \t8 \t15 \t10 \t18 \t20 \t-</p>"
此处有一个文件示例:http://dl.getdropbox.com/u/18116710/file.htm
我想用这种模式提取所有行:
</span>Cabildo \t456\t386\t70\t21\t4\t101\t36\t12\t88\t48\t84\t62\t-</p>
以便获得如下数据库:
Cabildo 456 386 70 21 4 101 36 12 88 48 62 -
Sierra Gorda 106 89 17 - - 26 9 8 15 10 20 -
...
“ - ”表示缺失(NA)。我一直在使用str_extract函数而没有任何结果(我对正则表达式很新)。
我的想法是获取</span>
和</p>
之间的内容,然后使用read.csv(带制表符分隔符)读取行,但这可能不是最好的方法,因为其他事情可能在这些标签之间。
有什么建议吗?
答案 0 :(得分:2)
这可以让你知道该怎么做 -
# break the string at each occurrence of </span> or </p>
b <- unlist(strsplit(a,"</span>|</p>"))
# removing the first element, which is just a blank
b <- b[-1]
# remove unneeded elements by looking for the </td> tag and filtering them out, this logic can be changed depending on how the complete dataset looks
c <- grep(x = b, pattern = "</td>", invert = TRUE, value = TRUE)
# breaking each string b/w </span> and </p> into individual columns, split by '/t'
d <- (strsplit(c,"\t"))
# appending all rows together to get one dataset
e <- data.frame(do.call(rbind,d))
输出 -
> e
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14
1 Cabildo 456 386 70 21 4 101 36 12 88 48 84 62 -
2 Sierra Gorda 106 89 17 - - 26 9 8 15 10 18 20 -
答案 1 :(得分:1)
如果您有很多这样的html文件,您可能需要查看此包: http://www.rexamine.com/resources/stringi/
它具有比stringr包更快的正则表达式函数实现。 要安装此软件包,只需运行:
source('http://static.rexamine.com/packages/stringi_install.R')
示例:
stri_split_regex(a, "</span>|</p>")