标签: xml2

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
查看次数

在 Fedora 27 中的 R 中安装 xml2

我在运行 Fedora 27 的 RStudio 中安装 xml2 时遇到问题。运行时install.packages('xml2'),出现以下错误:

\n\n
installing to /home/ryi/R/x86_64-redhat-linux-gnu-library/3.4/xml2/libs\n** R\n** inst\n** preparing package for lazy loading\n** help\nError : /tmp/Rtmp2sKZQZ/R.INSTALL689b37bd918d/xml2/man/read_xml.Rd:47: unable to load shared object '/home/ryi/R/x86_64-redhat-linux-gnu-library/3.4/xml2/libs/xml2.so':\n  libicui18n.so.58: cannot open shared object file: No such file or directory\nERROR: installing Rd objects failed for package \xe2\x80\x98xml2\xe2\x80\x99\n* removing \xe2\x80\x98/home/ryi/R/x86_64-redhat-linux-gnu-library/3.4/xml2\xe2\x80\x99\nWarning in install.packages :\n  installation of package \xe2\x80\x98xml2\xe2\x80\x99 had non-zero exit status\n\nThe downloaded source packages are in\n    \xe2\x80\x98/tmp/RtmpPs5Gzi/downloaded_packages\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n\n

我注意到在我的 中/usr/lib64/,我只有libicui18n.so.57,所以我尝试在那里复制 a libicui18n.so.58,但出现以下错误:

\n\n
installing to …
Run Code Online (Sandbox Code Playgroud)

r fedora libxml2 xml2

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

xml2 包 (R) 中的 xml_find_all 函数未找到相关节点

我在 R 中使用 xml2 包来访问 xml 数据,发现它在不同的 xml_documents 上表现不同。

在这个宠物例子中

library(xml2)
doc <- read_xml( "<MEMBERS>
                      <CUSTOMER>
                         <ID>178</ID>
                         <FIRST.NAME>Alvaro</FIRST.NAME>
                         <LAST.NAME>Juarez</LAST.NAME>
                         <ADDRESS>123 Park Ave</ADDRESS>
                         <ZIP>57701</ZIP>
                      </CUSTOMER>
                      <CUSTOMER>
                         <ID>934</ID>
                         <FIRST.NAME>Janette</FIRST.NAME>
                         <LAST.NAME>Johnson</LAST.NAME>
                         <ADDRESS>456 Candy Ln</ADDRESS>
                         <ZIP>57701</ZIP>
                      </CUSTOMER>  
                   </MEMBERS>")
doc
{xml_document}
<MEMBERS>
[1] <CUSTOMER>\n  <ID>178</ID>\n  <FIRST.NAME>Alvaro</FIRST.NAME>\n  <LAST.NAME>Juarez</LAST.NAME>\n  <ADDRESS>12 ...
[2] <CUSTOMER>\n  <ID>934</ID>\n  <FIRST.NAME>Janette</FIRST.NAME>\n  <LAST.NAME>Johnson</LAST.NAME>\n  <ADDRESS> ...
Run Code Online (Sandbox Code Playgroud)

我可以运行以下代码

xml_find_all(doc, "//FIRST.NAME")
{xml_nodeset (2)}
[1] <FIRST.NAME>Alvaro</FIRST.NAME>
[2] <FIRST.NAME>Janette</FIRST.NAME>
Run Code Online (Sandbox Code Playgroud)

给我预期的输出(找到所有带有“FIRST.NAME”标签的节点)。

但是,如果我对这个xml 文件执行相同的操作:

example <- read_xml(file.path("~/Downloads", "uniprot_subset.xml"))
> example
{xml_document}
<uniprot>
 [1] <entry xmlns="http://uniprot.org/uniprot" dataset="Swiss-Prot" created="2011-06-28" modified="2019-01-16" version="35">\n …
Run Code Online (Sandbox Code Playgroud)

xml r xml2

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

r rvest 错误:“doc_namespaces(doc) 中的错误:外部指针无效”

我的问题与此类似,但后者没有收到我可以使用的答案。我正在使用 抓取数千个网址xml2::read_html。这很好用。purrr::map_df但是当我尝试使用and解析生成的 html 文档时html_nodes,出现以下错误:

Error in doc_namespaces(doc) : external pointer is not valid
Run Code Online (Sandbox Code Playgroud)

由于某种原因,我无法使用示例重现该错误。下面的例子并不好,因为它工作得很好。但是,如果有人可以从概念上向我解释错误的含义以及如何解决它,那就太好了(这里有一个关于类似问题的github 线程,但我不遵循所有技术细节)。

library(rvest)
library(purrr)
urls_test <- list("https://en.wikipedia.org/wiki/FC_Barcelona",
             "https://en.wikipedia.org/wiki/Rome")
h <- urls_test %>% map(~{
  Sys.sleep(sample(seq(1, 3, by=0.001), 1))
  read_html(.x)})
out <- h %>% map_df(~{
  a <- html_nodes(., "#firstHeading") %>% html_text()
  a <- if (length(a) == 0) NA else a
  b <- html_nodes(., ".toctext") %>% html_text()
  b <- if (length(b) == 0) NA else b

  df <- tibble(a, b)
})
Run Code Online (Sandbox Code Playgroud)

会议信息: …

error-handling r rvest xml2 purrr

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

R:使用 xml2、doParallel 和 foreach 并行读取 xml 文件

目前我正在开发一个小型 R 项目,从 Word 文件中读取一些信息。由于这些是底层的压缩 xml 文件,我认为使用 R 来完成这个任务会非常容易。我的脚本基本上可以工作,但我想提高它的速度,所以我查看了 和doParallelforeach

library(foreach)
library(doParallel)

cores <- detectCores()
cl <- makeCluster(cores - 1)
registerDoParallel(cl)


file_list <- list.files(path = "/path/to/word/files", pattern = glob2rx("*.docx"), ignore.case = TRUE, full.names = TRUE, recursive = TRUE)


final <- foreach(
  filename = file_list[1:4], .combine = rbind, .packages = c("stringr", "xml2", "tibble"),
  .verbose = T, .inorder = FALSE
) %dopar% {

  name <- str_extract(filename, "[0-9a-f]{40}")


  # doc <- read_xml(unzip(zipfile = filename,  files = c("word/document.xml")), encoding = …
Run Code Online (Sandbox Code Playgroud)

foreach r doparallel xml2

5
推荐指数
0
解决办法
145
查看次数

R 中未定义的命名空间 xml2

我正在学习如何使用 R 来解析 XML,并且我正在尝试使用 Hadley 的 Wickhamxml2包来解析位于此处的TEI XML 文本文档(警告:这是一个压缩文件,我正在尝试解析的特定文件)在下面的代码中给出)。我试图了解命名空间在这个包中的工作原理(我无法理解我正在使用的特定文本的文档)。有了这个XML包,我可以执行以下操作:

library("XML")
crisis <- xmlParse("data/Crisis130_22.2.tei.xml")
all_divs <- getNodeSet(crisis, "//def:div",
                   namespaces=c(def = "http://www.tei-c.org/ns/1.0"))
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何做到这一点xml2。我要么收到inherits(x, "xml_document") is not TRUE错误,要么收到In node_find_all(x$node, x$doc, xpath = xpath, nsMap = ns) : Undefined namespace prefix [1219]错误。这是我尝试过的:

library("xml2")

crisis2 <- read_xml("data/Crisis130_22.2.tei.xml")

# check to see whether TEI URL is present
xml_ns(crisis2) 

all_divs2 <- xml_find_all(crisis2, "//div", xml_ns(crisis2)) # gives empty list

all_divs <- xml_find_all(crisis2, "/def:div", xml_ns(crisis2)) # undefined …
Run Code Online (Sandbox Code Playgroud)

xml xpath r xml-namespaces xml2

4
推荐指数
1
解决办法
1382
查看次数

find_xml_all返回{xml_nodeset(0)}

我最近从这张地图下载了KML文件,并尝试使用该软件包xml2来提取露营地的信息,例如地理位置,站点周围的设施等; 但我{xml_nodeset (0)}到最后.

Belows是我用过的代码,

library(xml2)
campsites <- read_xml("file_path")
xml_find_all(campsites, ".//Placemark")
Run Code Online (Sandbox Code Playgroud)

这是KML文件的结构(您也可以尝试xml_structure(campsites)),

> library(magrittr)
> campsites
{xml_document}
<kml>
[1] <Document>\n<description><![CDATA[powered by <a href="http://www.wordpress.org">WordPress</a> &amp; <a href="https://www.mapsmarker.com">MapsMarker.com</a>]] ...
>
> campsites %>% xml_children %>% xml_children %>% xml_children
{xml_nodeset (55)}
 [1] <IconStyle>\n  <Icon>\n    <href>http://www.mountaineering-lohas.org/wp-content/uploads/leaflet-maps-marker-icons/tents.png</href>\n  </Icon>\n</IconStyle>
 [2] <IconStyle>\n  <Icon>\n    <href>http://www.mountaineering-lohas.org/wp-content/uploads/leaflet-maps-marker-icons/tents-1.png</href>\n  </Icon>\n</IconStyle>
 [3] <IconStyle>\n  <Icon>\n    <href>http://www.mountaineering-lohas.org/wp-content/uploads/leaflet-maps-marker-icons/tents1.png</href>\n  </Icon>\n</IconStyle>
 [4] <name>香港營地 Hong Kong Camp Site</name>
 [5] <Placemark id="marker-1">\n<styleUrl>#tents</styleUrl>\n<name>æµæ°´éŸ¿ç‡Ÿåœ° ( Lau Shui Heung Camp Site )</name>\n<TimeStamp><when>2013-02-21T04:02:29+08: ...
 [6] <Placemark id="marker-2">\n<styleUrl>#tents</styleUrl>\n<name>鶴藪營地(Hok …
Run Code Online (Sandbox Code Playgroud)

r kml xml2

4
推荐指数
1
解决办法
886
查看次数

按名称提取节点

我正在尝试使用 xml2 解析 XML 文件。但是我终生无法通过指定名称来弄清楚如何做到这一点。

这有效:

library(xml2)
library(dplyr)

xml <- read_xml(file)
Run Code Online (Sandbox Code Playgroud)

-->

> xml
{xml_document}
<indexedmzML schemaLocation="http://psi.hupo.org/ms/mzml http://psidev.info/files/ms/mzML/xsd/mzML1.1.2_idx.xsd" xmlns="http://psi.hupo.org/ms/mzml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
[1] <mzML xmlns="http://psi.hupo.org/ms/mzml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://psi.hupo.org/ms/mzml  ...
[2] <indexList count="2">\n  <index name="spectrum">\n    <offset idRef="scanId=3027">15181</offset>\n    <offset idRef="scanId=3524">30052</offset> ...
[3] <indexListOffset>73363063</indexListOffset>
[4] <fileChecksum>b8f69d6276d9c4929e74416bc9e3446a173d1894</fileChecksum>
Run Code Online (Sandbox Code Playgroud)

我可以一步一步地和使用 xpath 按位置提取:

xml_child(xml, 1) %>% xml_child(7) %>% xml_attr("startTimeStamp")
Run Code Online (Sandbox Code Playgroud)

_

xml_child(xml, "/*[1]/*[7]") %>% xml_attr("startTimeStamp")
Run Code Online (Sandbox Code Playgroud)



但是,我按名称选择的尝试失败了。

> xml_child(xml, "indexedmzML")
{xml_missing}
<NA>
> xml_child(xml, "mzML")
{xml_missing}
<NA>
Run Code Online (Sandbox Code Playgroud)

> xml_child(xml, "/indexedmzML")
{xml_missing}
<NA>
> xml_child(xml, "/mzML")
{xml_missing}
<NA>
Run Code Online (Sandbox Code Playgroud)

> xml_child(xml, "/mzML/run") …
Run Code Online (Sandbox Code Playgroud)

r xml2

4
推荐指数
1
解决办法
800
查看次数

read_html(url) 和 read_html(content(GET(url), "text")) 的区别

我正在看这个很好的答案:https : //stackoverflow.com/a/58211397/3502164

解决方案的开头包括:

library(httr)
library(xml2)

gr <- GET("https://nzffdms.niwa.co.nz/search")
doc <- read_html(content(gr, "text"))

xml_attr(xml_find_all(doc, ".//input[@name='search[_csrf_token]']"), "value")
Run Code Online (Sandbox Code Playgroud)

输出在多个请求中保持不变:

"59243d3a2....61f8f73136118f9"
Run Code Online (Sandbox Code Playgroud)

到目前为止,我的默认方式是:

doc <- read_html("https://nzffdms.niwa.co.nz/search")
xml_attr(xml_find_all(doc, ".//input[@name='search[_csrf_token]']"), "value")
Run Code Online (Sandbox Code Playgroud)

结果与上面的输出不同,并在多个请求中发生变化。

题:

两者有什么区别:

  • read_html(url)
  • read_html(content(GET(url), "text"))

为什么它会导致不同的值,为什么只有“GET”解决方案会返回链接问题中的 csv?

(我希望可以在三个子问题的种类中对其进行结构化)。

我试过的:

走下函数调用的兔子洞:

read_html
(ms <- methods("read_html"))
getAnywhere(ms[1])
xml2:::read_html
xml2:::read_html.default
#xml2:::read_html.response

read_xml
(ms <- methods("read_xml"))
getAnywhere(ms[1])
Run Code Online (Sandbox Code Playgroud)

但这导致了这个问题:Find the used method for R wrapper functions

想法:

  • 我没有看到 get 请求采用任何标头或 Cookie,这可以解释不同的响应。

  • 从我的理解都read_htmlread_html(content(GET(.), "text"))返回XML / HTML。

  • 好的,在这里我不确定检查是否有意义,但因为我的想法用完了:我检查了是否有某种缓存正在进行。

代码:

with_verbose(GET("https://nzffdms.niwa.co.nz/search"))
....
<- Expires: Thu, …
Run Code Online (Sandbox Code Playgroud)

get r rvest xml2

4
推荐指数
1
解决办法
651
查看次数

使用带有xml2的管道运算符编写XML

XML2包允许用户创建XML文档.我正在尝试使用管道运算符创建一个文档%>%来添加子节点和兄弟节点的各种组合.我无法弄清楚如何在子节点内创建子节点,该子节点跟随原始子节点的兄弟节点(参见下面的示例).

是否有可能"升级"一个级别然后创建更多节点或者是否必须在链式命令之外创建它们?

我想要的是

library(xml2)
x1 <- read_xml("<parent><child>1</child><child><grandchild>2</grandchild></child><child>3</child><child>4</child></parent>")
message(x1)
#> <?xml version="1.0" encoding="UTF-8"?>
#> <parent>
#>  <child>1</child>
#>  <child>
#>    <grandchild>2</grandchild>
#>  </child>
#>  <child>3</child>
#>  <child>4</child>
#> </parent>
Run Code Online (Sandbox Code Playgroud)

我在创造那是错的

library(magrittr)
library(xml2)
x2 <- xml_new_document()
x2 %>% 
  xml_add_child("parent") %>%
  xml_add_child("child", 1) %>%
  xml_add_sibling("child", 4, .where="after") %>%
  xml_add_sibling("child", 3) %>%
  xml_add_sibling("child", .where="before") %>%
  xml_add_child("grandchild", 2)
message(x2)
#> <?xml version="1.0" encoding="UTF-8"?>
#> <parent>
#>  <child>1</child>
#>  <child>4</child>
#>  <child>
#>    <grandchild>2</grandchild>
#>  </child>
#>  <child>3</child>
#> </parent>
Run Code Online (Sandbox Code Playgroud)

使用XML包的解决方案

如果使用 …

r xml2

3
推荐指数
1
解决办法
372
查看次数

标签 统计

r ×10

xml2 ×10

rvest ×2

xml ×2

xpath ×2

doparallel ×1

error-handling ×1

fedora ×1

foreach ×1

get ×1

kml ×1

libxml2 ×1

purrr ×1

xml-namespaces ×1