我对R中的编码完全不熟悉,并且已经被广泛用于网页编写。 我有兴趣抓取与此示例类似的1012个链接列表:http://karakterstatistik.stads.ku.dk/Histogram/ASOB05038E/Summer-2015
因此所有元素都位于所有链接的相同位置。但是,使用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 :(得分:2)
HTML没有被破坏,当您尝试从“Inspect Element”视图中提出XPath时必须小心,因为大多数浏览器会在读取HTML时对HTML进行规范化。所以Firefox,Chrome(等等) al)可能会显示一个不错的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"
您可以在大多数浏览器中使用view-source
查看纯粹的HTML源代码,或devtools::install_github("hrbrmstr/xmlview")
并在上面的代码段中的xmlview::xml_view(pg)
上执行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"
你可以在某种程度上处理重复:
get_val(pg, "Antal tilmeldte")
## [1] "115" "" "Antal tilmeldte" "11"
但它可能并不完美。
如果你磨练你的XPath技能,你可以获得更多的目标(我不会再发布这个答案)。