代码之家  ›  专栏  ›  技术社区  ›  Martin C. Arnold

如何使用R替换目录中所有HTML文档的<head>部分中的代码

  •  0
  • Martin C. Arnold  · 技术社区  · 6 年前

    <head> </head>

    R是强制性的,因为这是一个rmarkdown课堂项目的一部分,我想让学生理解代码。

    相同的 调整CSS或links.js文件的行。

    我试着在R中使用 readLines() writeLines() 与正则表达式结合使用,但这似乎过于繁琐。我希望有一个更优雅和具体的解决方案,利用DOM。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Martin Schmelzer    6 年前

    我刚刚意识到,您想替换所有子节点。下面是实现这一点的代码。 lapply 要打开每个文件,请解析XML代码,删除 head script 带参数的元素 src 去吧。

    替换所有子节点

    library(XML)
    
    files <- list.files(full.names = T, pattern = "*.html")
    
    lapply(files, function(f) {
      content  <- xmlInternalTreeParse(f, isHTML = T)
      # get head node
      headNode <- getNodeSet(content, path = "//head")
      # remove all child nodes
      do.call(removeChildren, args = list(kids = names(xmlChildren(headNode[[1]])), node = headNode[[1]]))
      # create new nodes
      newNode  <- newXMLNode("script", attrs = list(src = "myScript.js"))
      # add new nodes
      addChildren(headNode[[1]], newNode)
      saveXML(doc = content, file = f)
    })
    

    library(XML)
    
    files <- list.files(full.names = T, pattern = "*.html")
    
    lapply(files, function(f) {
      content  <- xmlInternalTreeParse(f, isHTML = T)
      headNode <- getNodeSet(content, path = "//head")
      newNode  <- newXMLNode("script", attrs = list(src = "myScript.js"))
    
      addChildren(headNode[[1]], newNode)
      saveXML(doc = content, file = f)
    })