R在多个html标签之间提取结构化数据

时间:2018-04-15 23:35:04

标签: html r

我已经下载了我的Facebook数据。它包含一个包含所有联系人的htm文件。我想用R读取它,并创建一个contact.csv。

通常的结构是:

<tr><td>Firstname Lastname</td><td><span class="meta"><ul><li>contact: email@email.com</li><li>contact: +123456789</li></ul></span></td></tr>

但有些联系人可能会错过电话号码

<tr><td>Firstname Lastname</td><td><span class="meta"><ul><li>contact: email@email.com</li></ul></span></td></tr>

有些人错过了电子邮件

<tr><td>Firstname Lastname</td><td><span class="meta"><ul><li>contact: +123456789</li></ul></span></td></tr>

csv应该具有Firstname Lastname结构;电子邮件;电话号码

我试过了:

library(rvest)
library(stringr)

html <- read_html("contact_info.htm")
p_nodes <- html %>% html_nodes('tr')
p_nodes_text <- p_nodes %>% html_text()
write.csv(p_nodes_text, "contact.csv")

这为我创建了csv,但遗憾的是将名称与&#34;联系:&#34;并且不会创建单独的列,也不允许有&#34; NA&#34;缺少电话号码或电子邮件。

我怎样才能增强代码来实现这一目标? 感谢

1 个答案:

答案 0 :(得分:1)

您可以使用regexpr识别电子邮件&amp;电话号码:

xml1 <- '<tr><td>Firstname Lastname</td><td><span class="meta"><ul><li>contact: email@email.com</li><li>contact: +123456789</li></ul></span></td></tr>'
xml2 <- '<tr><td>Firstname Lastname</td><td><span class="meta"><ul><li>contact: email@email.com</li></ul></span></td></tr>'
xml3 <- '<tr><td>Firstname Lastname</td><td><span class="meta"><ul><li>contact: +123456789</li></ul></span></td></tr>'
docs <- c(xml1,xml2,xml3)

library(rvest)

df <- NULL

for ( doc in docs) {
 page <- read_html(doc)
 name <- page %>% html_nodes("tr td:first-child") %>% html_text()
 meta <- page %>% html_nodes("span.meta li") %>% html_text
 ind_mail <- grep(".{1,}\\@.{1,}\\..{1,}",meta)
 if(length(ind_mail)>0) mail <- meta[ind_mail] else mail <- "UNKWN"
 ind_tel <- grep("[0-9]{6,}$",meta)
 if(length(ind_tel)>0) tel <- meta[ind_tel] else tel <- "UNKWN"
 res <- cbind(name,mail,tel)
 df <- rbind(df,res)
}

希望这会有所帮助,

Gottavianoni