标签: xml2

Python/R:当并非所有节点都包含所有变量时,从XML生成数据帧?

请考虑以下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)数据框,其中包含列namehobby.

但是,如您所见,存在对齐问题,因为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 …

python xml r pandas xml2

8
推荐指数
1
解决办法
1101
查看次数

在R中解析XML:不正确的命名空间

我有一堆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)

xml r xml-namespaces xml2

7
推荐指数
1
解决办法
795
查看次数

使用xml2包读取大型XML文件并尝试创建工作闭包的问题

我正在使用该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)

xml r xml2

7
推荐指数
1
解决办法
641
查看次数

如何使用默认的 Web 代理设置在 R 中配置 curl 包?

我在商业环境中使用 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 …

curl r http-proxy xml2

7
推荐指数
1
解决办法
2301
查看次数

如何将 read_html 的输出保存和读取为 RDS 文件?

可以像这样保存和读取对象

# 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 对象的最简单方法是什么,以便它可以用最少的代码/大惊小怪加载回来?

r rvest xml2

7
推荐指数
2
解决办法
623
查看次数

R rvest:找不到函数"xpath_element"

我试图简单地复制示例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 httr rvest xml2 ubuntu-16.04

6
推荐指数
1
解决办法
1591
查看次数

R可以读取html编码的表情符号吗?

我的问题,如下所述,是如何使用R来读取包含HTML表情符号代码的字符串&#55358;&#56599;,并且(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: &#55358;&#56599;" 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)

xml html-encode r emoji xml2

6
推荐指数
1
解决办法
1137
查看次数

R {xml_node} 到纯文本同时保留标签?

我想做什么xml2::xml_text()rvest::html_text()做什么,但保留标签而不是<br>\n. 目标是例如抓取网页,提取我想要的节点,并将纯 HTML 存储在变量中,就像write_html()将其存储在文件中一样。

我怎样才能做到这一点?

r rvest xml2

6
推荐指数
1
解决办法
759
查看次数

R和xml2:即使节点丢失,如何读取不在子节点中的文本并读取信息

我使用R它的包xml2来解析html文档。我提取了一个html文件,它看起来像这样:

text <- ('<div>
<p><span class="number">1</span>First&nbsp;<span class="small-accent">previous</span></p>
<p><span class="number">2</span>Second&nbsp;<span class="accent">current</span></p>
<p><span class="number">3</span>Third&nbsp;</p>
<p><span class="number">4</span>Fourth&nbsp;<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)

xpath r xml2

5
推荐指数
1
解决办法
2110
查看次数

在 R 中,使用 rvest 和 xml2 从网站上的 &lt;script&gt; 元素中提取 JSON 对象

之前在此页面上发布了有关在 PGA 网站的排行榜页面上抓取表格的相关 stackoverflow 问题。总结那篇文章,由于该页面使用 javascript 呈现页面和表格的方式,排行榜显然难以抓取。

我可以检查并在标签中看到有一个global.leaderboardConfig包含有用信息的对象:

在此处输入图片说明

是否可以将此对象作为 R 中的列表获取?我能够使用 获取页面上的所有 76 个脚本元素xml2::read_html('https://www.pgatour.com/leaderboard.html') %>% html_nodes('script'),但是我不确定如何识别所需的特定脚本标记,也不知道如何从中获取对象。

编辑:在 devtools 的网络选项卡中,还有这个请求提供获取数据的 API 调用的链接。与从脚本标签中获取对象相比,获取所有网络请求并筛选这些请求是否更容易?

在此处输入图片说明

r web-scraping rvest xml2

5
推荐指数
1
解决办法
282
查看次数