2016-08-18 176 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