请考虑以下XML示例
library(xml2)
myxml <- read_xml('
<data>
<obs ID="a">
<name> John </name>
<hobby> tennis </hobby>
<hobby> golf </hobby>
<skill> python </skill>
</obs>
<obs ID="b">
<name> Robert </name>
<skill> R </skill>
</obs>
</data>
')
Run Code Online (Sandbox Code Playgroud)
在这里,我想从这个XML中获取一个(R或Pandas)数据框,其中包含列name和hobby.
但是,如您所见,存在对齐问题,因为hobby第二个节点中缺少对齐问题,John有两个爱好.
在R中,我知道如何一次提取一个特定值,例如使用xml2如下:
myxml%>%
xml_find_all("//name") %>%
xml_text()
myxml%>%
xml_find_all("//hobby") %>%
xml_text()
Run Code Online (Sandbox Code Playgroud)
但是如何在数据框中正确对齐此数据?也就是说,我如何获得如下的数据帧(注意我如何加入|John的两个爱好):
# A tibble: 2 × 3
name hobby skill
<chr> <chr> <chr>
1 John tennis|golf python
2 Robert <NA> R
Run Code Online (Sandbox Code Playgroud)
在R中,我更喜欢使用xml2和的解决方案dplyr …
我有一堆XML文件和一个R脚本,可以将其内容读入数据框.但是,我现在得到了我想像往常一样解析的文件,但是它们的命名空间定义中有些东西不允许我通常使用XPath表达式选择它们的值.
XML文件是这样的:
xml_nons.xml
<?xml version="1.0" encoding="UTF-8"?>
<XML>
<Node>
<Name>Name 1</Name>
<Title>Title 1</Title>
<Date>2015</Date>
</Node>
</XML>
Run Code Online (Sandbox Code Playgroud)
和另外一个:
xml_ns.xml
<?xml version="1.0" encoding="UTF-8"?>
<XML xmlns="http://www.nonexistingsite.com">
<Node>
<Name>Name 2</Name>
<Title>Title 2</Title>
<Date>2014</Date>
</Node>
</XML>
Run Code Online (Sandbox Code Playgroud)
xmlns指向的URL不存在.
我使用的R代码是这样的:
library(XML)
xmlfiles <- list.files(path = ".",
pattern="*.xml$",
full.names = TRUE,
recursive = TRUE)
n <- length(xmlfiles)
dat <- vector("list", n)
for(i in 1:n){
doc <- xmlTreeParse(xmlfiles[i], useInternalNodes = TRUE)
nodes <- getNodeSet(doc, "//XML")
x <- lapply(nodes, function(x){ data.frame(
Filename = xmlfiles[i],
Name = xpathSApply(x, ".//Node/Name" , xmlValue),
Title …Run Code Online (Sandbox Code Playgroud) 我正在使用该xml2包将一个巨大的XML文件读入内存,该命令失败并出现以下错误:
错误:字符0x0超出允许范围[9]
我的代码如下所示:
library(xml2)
doc <- read_xml('~/Downloads/FBrf.xml')
Run Code Online (Sandbox Code Playgroud)
数据可以在ftp://ftp.flybase.net/releases/FB2015_05/reporting-xml/FBrf.xml.gz(大约140MB)下载,解压后大约1.8GB.
有没有人建议如何找出哪些字符有问题或如何在阅读之前清理文件.
编辑
好的,因为文件很大,我搜索了堆栈溢出的其他解决方案,并试图实现他在这里介绍的Martin Morgan的解决方案在巨大的XML文件中组合值
所以我到目前为止所做的是以下几行代码
library(XML)
branchFunction <- function(progress=10) {
res <- new.env(parent=emptyenv()) # for results
it <- 0L # iterator -- nodes visited
list(publication=function(elt) {
## handle 'publication' nodes
if (getNodeSet(elt, "not(/publication/feature/id)"))
## early exit -- no feature id
return(NULL)
it <<- it + 1L
if (it %% progress == 0L)
message(it)
publication <- getNodeSet(elt, "string(/publication/id/text())") # 'key'
res[[publication]] <-
list(miniref=getNodeSet(elt,
"normalize-space(/publication/miniref/text())"),
features= xpathSApply(elt, "//feature/id/text()", xmlValue)) …Run Code Online (Sandbox Code Playgroud) 我在商业环境中使用 R,其中外部连接全部通过 Web 代理进行,因此我们需要指定代理服务器地址并确保我们使用 Windows 身份验证连接到它。
我已经有了将 RCurl 和 httr 包配置为默认使用这些设置的代码 - 即
httr::set_config(config(
proxy = "my.proxy.address",
proxyuserpwd = ":",
proxyauth = 4
))
Run Code Online (Sandbox Code Playgroud)
或者
opts <- list(
proxy = "my.proxy.address",
proxyuserpwd = ":",
proxyauth = 4
)
RCurl::options(RCurlOptions = opts)
Run Code Online (Sandbox Code Playgroud)
但是,在最近的几个案例中,我发现依赖curl包来发出 Web 请求的包 - 例如xml2::read_xml- 我找不到任何方法来设置相同的代理选项,因此默认情况下它们会被选中并由 curl 使用。
如果我自己直接使用 curl,我可以在新句柄上设置选项,以下代码足以成功工作:
h = new_handle(proxy = "my.proxy.address",
proxyuserpwd = ":")
con = curl(url,handle = h)
page = xml2::read_xml(con)
Run Code Online (Sandbox Code Playgroud)
...但是当 curl 的使用被埋在其他人的功能中时,这没有任何帮助!
或者,我知道我可以为代理地址设置一个环境变量,如下所示:
Sys.setenv(https_proxy = "https://my.proxy.address")
Run Code Online (Sandbox Code Playgroud)
... libcurl …
可以像这样保存和读取对象
# Save as file
saveRDS(iris, "mydata.RDS")
# Read back in
readRDS("mydata.RDS")
Run Code Online (Sandbox Code Playgroud)
但这似乎不适用于用 xml2::read_html()
library(rvest)
someobject <- read_html("https://stackoverflow.com/")
saveRDS(someobject, "someobject.RDS")
Run Code Online (Sandbox Code Playgroud)
它创建了一个文件,但不像预期的那样
readRDS("someobject.RDS")
Error in doc_is_html(x$doc) : external pointer is not valid
Run Code Online (Sandbox Code Playgroud)
发生了什么以及保存 html 对象的最简单方法是什么,以便它可以用最少的代码/大惊小怪加载回来?
我试图简单地复制示例rvest::html_nodes(),但遇到错误:
library(rvest)
ateam <- read_html("http://www.boxofficemojo.com/movies/?id=ateam.htm")
html_nodes(ateam, "center")
Run Code Online (Sandbox Code Playgroud)
do.call中的错误(方法,列表(parsed_selector)):找不到函数"xpath_element"
同样的情况,如果我打开包,例如httr,xml2,selectr.我似乎也有这些软件包的最新版本......
在该包的功能,例如xpath_element,xpath_combinedselector在什么位置?我如何让它工作?请注意,我在Ubuntu 16.04上运行,因此该代码可能适用于其他平台...
我的问题,如下所述,是如何使用R来读取包含HTML表情符号代码的字符串��,并且(1 ) in the parsed string, or (2) convert it into its text equivalent (":hugging face:")?
我有一个文本消息的XML数据集(来自Android/iOS应用程序[信号])(https://signal.org/),我正在阅读R文本挖掘项目.数据看起来像这样,每个文本消息都在sms节点中表示:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!-- File Created By Signal -->
<smses count="1">
<sms protocol="0" address="+15555555555" contact_name="Jane Doe" date="1483256850399" readable_date="Sat, 31 Dec 2016 23:47:30 PST" type="1" subject="null" body="Hug emoji: ��" toa="null" sc_toa="null" service_center="null" read="1" status="-1" locked="0" />
</smses>
Run Code Online (Sandbox Code Playgroud)
我目前正在使用xml2R 的包读取这些数据.xml2::read_xml但是,当我使用该函数时,我收到以下错误消息:
Error in doc_parse_raw(x, encoding = encoding, base_url …Run Code Online (Sandbox Code Playgroud) 我想做什么xml2::xml_text()或rvest::html_text()做什么,但保留标签而不是<br>用\n. 目标是例如抓取网页,提取我想要的节点,并将纯 HTML 存储在变量中,就像write_html()将其存储在文件中一样。
我怎样才能做到这一点?
我使用R它的包xml2来解析html文档。我提取了一个html文件,它看起来像这样:
text <- ('<div>
<p><span class="number">1</span>First <span class="small-accent">previous</span></p>
<p><span class="number">2</span>Second <span class="accent">current</span></p>
<p><span class="number">3</span>Third </p>
<p><span class="number">4</span>Fourth <span class="small-accent">last</span> A</p>
</div>')
Run Code Online (Sandbox Code Playgroud)
我的目标是从文本中提取信息并将其转换为数据框,如下所示:
number label text_of_accent type_of_accent
1 1 First previous small-accent
2 2 Second current accent
3 3 Third
4 4 Fourth A last small-accent
Run Code Online (Sandbox Code Playgroud)
我尝试了以下代码:
library(xml2)
library(magrittr)
html_1 <- text %>%
read_html() %>%
xml_find_all( "//span[@class='number']")
number <- html_1 %>% xml_text()
label <- html_1 %>%
xml_parent() %>%
xml_text(trim = TRUE)
text_of_accent <- html_1 %>%
xml_siblings() %>% …Run Code Online (Sandbox Code Playgroud) 之前在此页面上发布了有关在 PGA 网站的排行榜页面上抓取表格的相关 stackoverflow 问题。总结那篇文章,由于该页面使用 javascript 呈现页面和表格的方式,排行榜显然难以抓取。
我可以检查并在标签中看到有一个global.leaderboardConfig包含有用信息的对象:
是否可以将此对象作为 R 中的列表获取?我能够使用 获取页面上的所有 76 个脚本元素xml2::read_html('https://www.pgatour.com/leaderboard.html') %>% html_nodes('script'),但是我不确定如何识别所需的特定脚本标记,也不知道如何从中获取对象。
编辑:在 devtools 的网络选项卡中,还有这个请求提供获取数据的 API 调用的链接。与从脚本标签中获取对象相比,获取所有网络请求并筛选这些请求是否更容易?
r ×10
xml2 ×10
rvest ×4
xml ×4
curl ×1
emoji ×1
html-encode ×1
http-proxy ×1
httr ×1
pandas ×1
python ×1
ubuntu-16.04 ×1
web-scraping ×1
xpath ×1