用rvest提取xml路径

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用rvest提取xml路径相关的知识,希望对你有一定的参考价值。

任何人都可以使用rvest协助从这个XML中提取路径吗?如果没有,我可以恢复字符提取,但更喜欢rvest。我在这个页面上尝试从svg文件中提取国家/地区形状:https://visionscarto.net/base-maps

require(rvest)
require(xml2)

doc = read_xml('https://visionscarto.net/public/fonds-de-cartes-en/visionscarto-airocean.svg')

zim = doc %>% xml_node('.ZWE')

str(zim)
#> List of 2
#>  $ node:<externalptr> 
#>  $ doc :<externalptr> 
#>  - attr(*, "class")= chr "xml_node"

cat(as.character(zim))
#> <g class="country ZWE" id="ZWE Zimbabwe" inkscape:groupmode="layer" inkscape:label="ZWE Zimbabwe">
#>   <path d="M178.84 80.84l.67-.54.16-.54.71-.4.41-.48 1.27-.3.98-.78 1.2.31.5.38.57-.42 1.35-.14 1.34-.14 1.14.2.45-.07 1.53.33-1.28 1.33-.49.3-.3.45.34 1.4.27 1.98-.26.55.36.52-.03 1.17-.58 1.13-.58-.32-.82 1.1-.76.36h-.56l-.58.53-.97.31-1.74-1.41-.75-1.02-1-.9-.56-.13-.71-.8.02-.28-.74-1.14z"/>
#> </g>

zim %>% xml_node('path')
#> {xml_missing}
#> <NA>
zim %>% xml_attr('d')
#> [1] NA
答案

这有效,但与XML命名空间一样,我从来都不明白为什么:

> xml_find_all(doc, "//*[@id='ZWE Zimbabwe']/d1:path") 
{xml_nodeset (1)}
[1] <path d="M178.84 80.84l.67-.54.16-.54.71-.4.41-.48 1.27-.3.98-.78 1.2.31. ...

并将其输入`xml_attr(...,“d”)将获得路径字符串。

d1是默认命名空间,您可以在文档中看到名称空间:

> xml_ns(doc)
d1       <-> http://www.w3.org/2000/svg
inkscape <-> http://www.inkscape.org/namespaces/inkscape
xlink    <-> http://www.w3.org/1999/xlink

Brucie Bonus问题可能应该是另一个问题,并且可能已经有了答案 - 有人必须有解析SVG路径字符串的方法。我做得不好吗?

以上是关于用rvest提取xml路径的主要内容,如果未能解决你的问题,请参考以下文章

R爬虫总结 | RCurl/httr(请求)→XML/xml2/rvest(解析)

R:rvest提取innerHTML

使用rvest在页面中提取多个表

rvest - 在 1 个标签中抓取 2 个类

R:使用 rvest 包而不是 XML 包从 URL 获取链接

使用 rvest 和 selectorgadget 从 GEO 提取信息,得到错误:“类中的错误(输出)<-“XMLNodeSet”:尝试将属性设置为 NULL”