str_split - 就像用Rvest从网页创建项目列表一样

时间:2015-05-26 17:43:32

标签: r web-scraping rvest

我正在尝试抓取像this这样的网页。我一直在与Rvest合作。

该页面显示了几个生物医学文献引文。每个引用项包含一个指向源的链接,一个包含一些结构化信息的表,在某些情况下,还包含一个名为“Notes”的块引用,其中包含一些非结构化信息。

我想拉出每个引文并单独处理它。但是,每个引用的链接,表格和块引用元素不在一个div中,它们只是堆叠在同一组元素上以供下一次引用。我不能单独拉出每个元素,因为有时候blockquote不存在,所以它们不会匹配。

如何用Rvest解决这个问题?但是,每次引用后都有一个hr标签。有没有办法使用hr标签将xml_nodeset类拆分为项目列表?

2 个答案:

答案 0 :(得分:0)

我做了一点rvest和一些数据清理。希望它会为你推广:

library(rvest)
library(dplyr)

获取网址:

url<html('http://examine.com/rubric/effects/view/552/Symptoms+of+Irritable+Bowel+Syndrome/all/')

每项研究的标题都保存在<a>网络链接包装内。获取这些并清理换行符。添加一些研究并放入df。

selector_name<-"a"
titles<-html_nodes(url, selector_name) %>% html_text()
titles <- gsub("[\r\n\t]", "", titles)
titles <- as.data.frame(titles)
titles$studyno <- 1:nrow(titles)

正如您所指出的,内容位于表中,因此请使用<td>包装器获取信息并清除换行符:

selector_name<-"td"
content<-html_nodes(url, selector_name) %>% html_text()
content <- gsub("[\r\n\t]", "", content)

然后清理一下并match得到df:

df <- as.data.frame(matrix(content, ncol=2, byrow=T))
df$studyno <- cumsum(df$V1=="Change of Effect")

df$title <- titles$titles[match(df$studyno, titles$studyno)]

 head(df,7)

#                  V1                                              V2 studyno
#1   Change of Effect                                       decrease        1
#2       Trial Design                                            meta       1
#3       Trial Length                                              na       1
#4 Number of Subjects                                             392       1
#5             Gender                                           mixed       1
#6   Change of Effect Decrease   (Statistically Significant, p-value        2
#7       Trial Design                                    Double Blind       2
                                                                                                                                  #title
#1 Effect of fibre, antispasmodics, and peppermint oil in the treatment ...
#2 Effect of fibre, antispasmodics, and peppermint oil in the treatment ...
#3 Effect of fibre, antispasmodics, and peppermint oil in the treatment ...
#4 Effect of fibre, antispasmodics, and peppermint oil in the treatment ...
#5 Effect of fibre, antispasmodics, and peppermint oil in the treatment ...
#6 Treatment Of Irritable Bowel Syndrome With Peppermint Oil. A Double-...
#7 Treatment Of Irritable Bowel Syndrome With Peppermint Oil. A Double-...

答案 1 :(得分:0)

您可以使用正则表达式。首先,将HTML代码保存到string_input。

首先,让我们提取所有链接(我猜它们介于content =和&gt;之间,否则你只需要更改它)

library(stringr)
vector_links <- str_extract_all(string_input, "content=(.+?)>")

vector_links的每个元素都包含一个链接。我们只提取网址。

char_link <- vector_links[[1]]
vector_links <- lapply(vector_links, function(char_link){
  substring(char_link, 9, nchar(char_link) - 3)
})