我已经下载了我的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;缺少电话号码或电子邮件。
我怎样才能增强代码来实现这一目标? 感谢
答案 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