的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技能,你可以获得更多的目标(我不会再发布这个答案)。
虽然你没有使用'rselenium',但是... –
不,我知道,但我用它的链接列表,我想知道如果我可以用它来刮。你有建议如何去做? – rfairy
_technically_这不是一个错误信息。它只是'xml_nodeset'类的默认打印方法,让您知道'html_nodes()'调用的结果值中有0个元素。 – hrbrmstr