使用R和Rvest抓取和提取XML站点地图元素
我需要使用Rvest从多个XML文件中提取大量XML站点地图元素。我已经能够使用XPath从网页中提取html_节点,但是对于xml文件,这对我来说是新的 而且,我找不到一个Stackoverflow问题,它允许我解析xml文件地址,而不是解析一大块xml文本 我在html中使用的示例:使用R和Rvest抓取和提取XML站点地图元素,r,xml,web-scraping,rvest,R,Xml,Web Scraping,Rvest,我需要使用Rvest从多个XML文件中提取大量XML站点地图元素。我已经能够使用XPath从网页中提取html_节点,但是对于xml文件,这对我来说是新的 而且,我找不到一个Stackoverflow问题,它允许我解析xml文件地址,而不是解析一大块xml文本 我在html中使用的示例: library(dplyr) library(rvest) webpage <- "https://www.example.co.uk/" data <- webpage %>% re
library(dplyr)
library(rvest)
webpage <- "https://www.example.co.uk/"
data <- webpage %>%
read_html() %>%
html_nodes("any given node goes here") %>%
html_text()
库(dplyr)
图书馆(rvest)
网页%
html_节点(“任何给定节点都在此处”)%>%
html_text()
我如何调整它以从XML文件(解析地址)中获取“loc”XML文件元素,如下所示:
<urlset>
<url>
<loc>https://www.example.co.uk/</loc>
<lastmod>2020-05-01</lastmod>
<changefreq>always</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://www.example.co.uk/news</loc>
<changefreq>always</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://www.example.co.uk/news/uk</loc>
<changefreq>always</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.example.co.uk/news/weather</loc>
<changefreq>always</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.example.co.uk/news/world</loc>
<changefreq>always</changefreq>
<priority>0.5</priority>
</url>
https://www.example.co.uk/
2020-05-01
总是
0.8
https://www.example.co.uk/news
总是
0.6
https://www.example.co.uk/news/uk
总是
0.5
https://www.example.co.uk/news/weather
总是
0.5
https://www.example.co.uk/news/world
总是
0.5
以下是我在Dave善意提供的脚本中所做的更改:
library(xml2)
#list of files to process
fnames<-c("xml1.xml")
dfs<-lapply(fnames, function(fname) {
doc<-read_xml(fname)
#find loc and lastmod
loc<-trimws(xml_text(xml_find_all(doc, ".//loc")))
lastmod<-trimws(xml_text(xml_find_all(doc, ".//last")))
#find all of the nodes/records under the urlset node
nodes<-xml_children(xml_find_all(doc, ".//urlset"))
#find the sub nodes names and values
nodenames<-xml_name(nodes)
nodevalues<-trimws(xml_text(nodes))
#make data frame of all the values
df<-data.frame(file=fname, loc=loc, lastmod=lastmod, node.names=nodenames,
values=nodevalues, stringsAsFactors = FALSE, nrow(0))
})
#Make one long df
longdf<-do.call(rbind, dfs)
#make into a wide format
library(tidyr)
finalanswer<-spread(longdf, key=node.names, value=values)
库(xml2)
#要处理的文件列表
fnames由于每个url节点的子节点数量不同,因此这是一种有效的方法:
file<-read_xml(text)
library(dplyr)
#find parent nodes
parents <-xml_find_all(file, ".//url")
#parse each child
dfs<-lapply(parents, function(node){
#Find all children
nodes <- xml_children(node)
#get node name and value
nodenames<- xml_name(nodes)
values <- xml_text(nodes)
#made data frame with results
df<- as.data.frame(t(values), stringsAsFactors=FALSE)
names(df)<-nodenames
df
})
#Make find answer
answer<-bind_rows(dfs)
file我有一段时间前写的代码,用于检查文件中的所有XML,并收集XML模式的特定节点,稍加调整,您可能会用到一些东西
library("xml2")
library("XML")
setwd("/xml")
dir <- dir()
tabela=matrix(NA,nrow=length(a),ncol=1)
for(i in 1:length(dir)){
visitNode <- function(node) {#Recursive Function to visit the XML tree (depth first)
if (is.null(node)) {#leaf node reached. Turn back
return()
}
print(paste("Node: ", xmlName(node)))
num.children = xmlSize(node)
if(num.children == 0 ) {# Add your code to process the leaf node here
print( paste(" ", xmlValue(node)))
}
if (num.children > 0){#Go one level deeper
for (i in 1 : num.children) {
visitNode(node[[i]][["NFe"]]) #the i-th child of node
}
}
}
xmlfile <- dir[i]
xtree <- xmlInternalTreeParse(xmlfile)
root <- xmlRoot(xtree)
dataxml <- visitNode(root)
dataxml <- xmlToList(root)
df<- as.data.frame(matrix(unlist(dataxml$NFe$infNFe$infAdic$infCpl), nrow=length(dataxml$NFe$infNFe$infAdic$infCpl),byrow=TRUE))
库(“xml2”)
库(“XML”)
setwd(“/xml”)
dir如果是XML,那么您只需要xml2包(rvest是这个包的扩展)。首先看这个问题:谢谢,但我得到“错误:参数意味着行数不同:1,0”我编辑了上面的内容,以显示我想从中提取元素的另一个文件。也许这就是我遇到问题的原因。你能帮忙吗?这两个文件有不同的结构,所以是的,这会导致错误。第一个具有父节点的“站点地图”,第二个具有“url”。是否有其他类型的文件或仅此2个?如果只是2,我的方法是编写两个不同的函数来解析每个类型,然后合并结果。如果有2个或3个以上,那么这将变得更加困难,因为所有内容都需要相对引用,并且节点无法直接命名。为了简单起见,我已更改了所需的文件格式,并根据您的答案添加了我正在使用的脚本。我在你的剧本中没有正确地改编什么。我总是犯同样的错误。注意,我在工作目录中设置了XML文件,它的名称正确。难以置信,Dave。非常感谢您为我跟进并改编此内容:)
library("xml2")
library("XML")
setwd("/xml")
dir <- dir()
tabela=matrix(NA,nrow=length(a),ncol=1)
for(i in 1:length(dir)){
visitNode <- function(node) {#Recursive Function to visit the XML tree (depth first)
if (is.null(node)) {#leaf node reached. Turn back
return()
}
print(paste("Node: ", xmlName(node)))
num.children = xmlSize(node)
if(num.children == 0 ) {# Add your code to process the leaf node here
print( paste(" ", xmlValue(node)))
}
if (num.children > 0){#Go one level deeper
for (i in 1 : num.children) {
visitNode(node[[i]][["NFe"]]) #the i-th child of node
}
}
}
xmlfile <- dir[i]
xtree <- xmlInternalTreeParse(xmlfile)
root <- xmlRoot(xtree)
dataxml <- visitNode(root)
dataxml <- xmlToList(root)
df<- as.data.frame(matrix(unlist(dataxml$NFe$infNFe$infAdic$infCpl), nrow=length(dataxml$NFe$infNFe$infAdic$infCpl),byrow=TRUE))