2016-08-18 103 views
0

我對R編碼是全新的,並且已被拋出到網頁瀏覽。 我對抓取與本示例類似的1012個鏈接列表感興趣:http://karakterstatistik.stads.ku.dk/Histogram/ASOB05038E/Summer-2015刮壞HTML網站

因此,所有鏈接上的所有元素都位於相同的位置。但是,使用SelectorGadget進行刮取不起作用。使用XPath我已經試過ALSP,但它是沒有用的:

library(xml2) 
link = "http://karakterstatistik.stads.ku.dk/Histogram/ASOB05038E/Summer-2015" 
link %>% 
read_html() %>% 
html_nodes(xpath = "//*[@id='karsumForm']/table/tbody/tr[8]/td[2]") 

我得到的錯誤信息:

{xml_nodeset(0)}

+0

雖然你沒有使用'rselenium',但是... –

+0

不,我知道,但我用它的鏈接列表,我想知道如果我可以用它來刮。你有建議如何去做? – rfairy

+0

_technically_這不是一個錯誤信息。它只是'xml_nodeset'類的默認打印方法,讓您知道'html_nodes()'調用的結果值中有0個元素。 – hrbrmstr

回答

2

的HTML是不因爲大多數瀏覽器在讀取HTML時會對HTML進行標準化,所以當您嘗試從「Inspect Element」視圖提供XPath時,必須小心。因此,Firefox,Chrome(等)可能會顯示一個不錯的table > tbody > tr > ...結構但頁面上可能不存在tbody標籤。

library(rvest) 

URL <- "http://karakterstatistik.stads.ku.dk/Histogram/ASOB05038E/Summer-2015" 

pg <- read_html(URL) 

html_nodes(pg, xpath=".//form[@id='karsumForm']/table/tr[8]/td[2]") %>% 
    html_text() %>% 
    trimws() 
## [1] "115" 

您可以在代碼片段上pg使用在大多數瀏覽器view-source看到純粹的HTML源或devtools::install_github("hrbrmstr/xmlview")xmlview::xml_view(pg)上面看到從該網站原始的HTML(有一個模式在我xmlview包也可以測試XPath篩選器)。

如果有非重複「命名字段」,那麼你可以這樣做:

get_val <- function(x, label) { 
    xpath <- sprintf(".//table/tr/td[contains(., '%s')][1]/following-sibling::td", label) 
    html_nodes(x, xpath=xpath) %>% html_text() %>% trimws() 
} 

get_val(pg, "Fakultet") 
## [1] "Det Samfundsvidenskabelige Fakultet" 

get_val(pg, "Institut") 
## [1] "Sociologisk Institut" 

get_val(pg, "Termin") 
## [1] "s15" 

get_val(pg, "ECTS") 
## [1] "15" 

get_val(pg, "Andre versioner") %>% gsub("[[:space:]]+", ", ", .) 
## [1] "s16, v15, s14, s13, s12, s11" 

可以有所應對的DUP:

get_val(pg, "Antal tilmeldte") 
## [1] "115"    ""    "Antal tilmeldte" "11"  

但它可能不會是完美的。

如果你磨練你的XPath技能,你可以獲得更多的目標(我不會再發布這個答案)。

+0

當我運行代碼時,我建議您在控制檯中看到以下消息: xmlXPathEval:評估失敗字符(0) 警告消息: 在xpath_search(x $ node,x $ doc,xpath = xpath,nsMap = ns,num_results = Inf): 無效的謂詞[1206] 我不能完全弄清楚代碼有什麼問題 – rfairy

+0

我不小心刪除了']'(並修復了它) – hrbrmstr

+0

啊是啊,它現在的作品,謝謝!但是,當我看着包含哪些PG它給了我: > PG [1:10] $節點 <指針:0x1029c3650> $ DOC <指針:0x10291bca0> $ NULL 而最後一個繼續下去。我只是想知道我怎樣才能抓取信息,比如哪個研究所是「Institut」和其他來自pg的東西? 感謝您花時間回答我! :) – rfairy