我使用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) 我在运行 Fedora 27 的 RStudio 中安装 xml2 时遇到问题。运行时install.packages('xml2'),出现以下错误:
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\nRun Code Online (Sandbox Code Playgroud)\n\n我注意到在我的 中/usr/lib64/,我只有libicui18n.so.57,所以我尝试在那里复制 a libicui18n.so.58,但出现以下错误:
installing to …Run Code Online (Sandbox Code Playgroud) 我在 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) 我的问题与此类似,但后者没有收到我可以使用的答案。我正在使用 抓取数千个网址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)
会议信息: …
目前我正在开发一个小型 R 项目,从 Word 文件中读取一些信息。由于这些是底层的压缩 xml 文件,我认为使用 R 来完成这个任务会非常容易。我的脚本基本上可以工作,但我想提高它的速度,所以我查看了 和doParallel包foreach。
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) 我正在学习如何使用 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) 我最近从这张地图下载了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> & <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) 我正在尝试使用 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) 我正在看这个很好的答案: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_html和read_html(content(GET(.),
"text"))返回XML / HTML。
好的,在这里我不确定检查是否有意义,但因为我的想法用完了:我检查了是否有某种缓存正在进行。
代码:
with_verbose(GET("https://nzffdms.niwa.co.nz/search"))
....
<- Expires: Thu, …Run Code Online (Sandbox Code Playgroud) 该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包的解决方案
如果使用 …