2017-02-15 38 views
-2

請考慮一個網站,其中包含4個或更多列表<li> html元素。 例如像這樣的網站:https://www.cprd.com/bibliography/bibliography.html如何將網頁中的HTML列表讀入R

使用xml2(或其他方法,但xml2和管道是首選),什麼是提取列表爲字符的矢量的最佳方式?

url <- 'https://www.cprd.com/bibliography/bibliography.html' 
library(xml2) 
page <- read_html(url) 

輸出結果應該是網站上<li>列表的列表。 (每年有一個名單)

而第一個名單應該有第一個項目等於'降低血糖藥物的啓動者之間的竄偏誤評估:英國隊列研究。 Ankarfeldt MZ,Thorsted BL,Groenwold RH,Adalsteinsson E,Ali MS,Klungel OH。 Clin Epidemiol。 2017; 9:19-30「。

編輯:意見提出

library(rvest) 
output<-page %>% html_nodes('ol') %>% lapply(html_nodes, 'li') %>% lapply(html_text, trim = TRUE) 
output[[1]][1] 

[1] "Assessment of channeling bias among initiators of glucose-lowering drugs: A UK cohort study. \r\n  Ankarfeldt MZ, Thorsted BL, Groenwold RH, Adalsteinsson E, Ali MS, Klungel OH. Clin Epidemiol. 2017;9:19㤼㸶30." 
+1

你有試過什麼嗎?你遇到什麼問題? – Jota

+0

嘗試使用['rvest'](http://stat4701.github.io/edav/2015/04/02/rvest_tutorial/)包:'library(rvest); read_html('https://www.cprd.com/bibliography/bibliography.html')%>% html_nodes('ol')%>% lapply(。,function(x)html_nodes(x,'li') %>%html_text())'。 – Abdou

+1

@Abdou如果你的'lapply'(或者'purrr :: map',隨着情況變得更加複雜將變得更加方便)兩次,代碼將更容易閱讀:'h2%>%html_nodes('ol') %>%lapply(html_nodes,'li')%> lapply(html_text,trim = TRUE)'從時間上看,它們幾乎完全相同。 – alistaire

回答

1

使用rvest(即超過xml2略有改善):

library(rvest) 

url <- 'https://www.cprd.com/bibliography/bibliography.html' 

page <- read_html(url) %>% 
    html_nodes('ol') %>% 
    map(~html_nodes(.x, 'li') %>% 
     html_text() %>% 
     gsub(pattern = '\\t|\\r|\\n', replacement = '') 
) 

gsub照顧取出特殊字符,如 '新線' 和「製表'