我正在尝试抓取像this这样的网页。我一直在与Rvest合作。
该页面显示了几个生物医学文献引文。每个引用项包含一个指向源的链接,一个包含一些结构化信息的表,在某些情况下,还包含一个名为“Notes”的块引用,其中包含一些非结构化信息。
我想拉出每个引文并单独处理它。但是,每个引用的链接,表格和块引用元素不在一个div中,它们只是堆叠在同一组元素上以供下一次引用。我不能单独拉出每个元素,因为有时候blockquote不存在,所以它们不会匹配。
如何用Rvest解决这个问题?但是,每次引用后都有一个hr标签。有没有办法使用hr标签将xml_nodeset类拆分为项目列表?
答案 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)
})