刮掉破碎的html网站

时间:2016-08-18 08:32:53

标签: html r xpath

我对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)}

1 个答案:

答案 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技能,你可以获得更多的目标(我不会再发布这个答案)。