【发布时间】:2020-08-15 21:22:53
【问题描述】:
我需要使用 Rvest 从多个 xml 文件中提取大量 XML 站点地图元素。我已经能够使用 xpaths 从网页中提取 html_nodes,但是对于 xml 文件,这对我来说是新的。
而且,我找不到让我解析 xml 文件地址而不是解析大量 XML 文本块的 Stackoverflow 问题。
我用于 html 的示例:
library(dplyr)
library(rvest)
webpage <- "https://www.example.co.uk/"
data <- webpage %>%
read_html() %>%
html_nodes("any given node goes here") %>%
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>
这是我在 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)
【问题讨论】:
-
如果是 XML 那么你只需要 xml2 包(rvest 是这个包的扩展)。将此问题视为开始:stackoverflow.com/questions/54237549/…
-
谢谢,但我得到“错误:参数暗示不同的行数:1, 0”
-
我已经编辑了上面的内容以显示我想从中提取
元素的另一个文件。也许这就是为什么我遇到不同行的问题。你能帮忙吗? -
这两个文件有不同的结构,所以是的,这会导致错误。第一个具有父节点的“站点地图”,第二个具有“url”。是否有其他类型的文件或只有这 2 个?如果只是 2,我的方法是编写两个不同的函数来解析每种类型,然后合并结果。如果超过 2 或 3 个,那么这将变得更加困难,因为一切都需要相对引用,并且无法直接命名节点。
-
为简单起见,我更改了所需的文件格式,并根据您的回答添加了我正在使用的脚本。我在你的脚本中没有正确适应什么。我不断收到同样的错误。注意我在工作目录中设置了 XML 文件,并且命名正确。
标签: r xml web-scraping rvest