首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于条件编译NodeSet (xml2)

基于条件编译NodeSet (xml2)
EN

Stack Overflow用户
提问于 2022-10-12 13:05:39
回答 1查看 22关注 0票数 0

我正在尝试选择一个节点集并从子节点中提取文本。然而,源XML并不具有严格的结构。项目可以是两种类型,文本要在两个不同的节点中提取。下面是简化的示例。

代码语言:javascript
复制
<p_item>
    <id>id1</id>
</p_item>
<e_item>
    <e_id>id2</e_id>
</e_item>
<p_item>
    <id>id3</id>>
    <e_id>id3</e_id>
</p_item>

有些p_items同时包含id和e_id。如果我选择所有项(p_item + e_item),对于某些p_item,我会得到两个id。我希望每个项目都有一个id,这样我就可以将生成的字符向量绑定到dataframe。我想使用管道语义,循环这些项并编译节点集如下:如果item是p_item提取id如果item是e_item提取e_id如果item是p_item同时具有id + e_id,则只提取id

我无法理解如何使用purrr::map编译节点集。在最后一步,我想使用

代码语言:javascript
复制
xml_find_all(id | e_id) %>% 
xml_text()

并将相同长度的字符向量绑定到最终数据。有人有过类似问题的经验吗?谢谢你分享你的知识。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-29 20:26:51

不知道像目前所说的那样,purrr在哪里出现了问题。您可以根据感兴趣的类型选择器值将需求写入css选择器列表,并指定与组合器(例如后代组合器)之间的关系。选择器列表中的“,”允许在可以匹配左或右模式的情况下进行OR选择。

代码语言:javascript
复制
library(rvest)

html <- '<p_item>
    <id>id1</id>
</p_item>
<e_item>
    <e_id>id2</e_id>
</e_item>
<p_item>
    <id>id3</id>>
    <e_id>id3</e_id>
</p_item>'

page <- read_html(html)

page |> html_elements('p_item id, e_item e_id') |> html_text()

我想,如果您想要处理可能丢失的子节点,可以使用purrr。

代码语言:javascript
复制
html2 <- '
<p_item>
    <id>id1</id>
</p_item>
<p_item>
    <unknown>not_me</unknown>
</p_item>
<e_item>
    <e_id>id2</e_id>
</e_item>
<p_item>
    <id>id3</id>>
    <e_id>id3</e_id>
</p_item>'

library(purrr)

page2 <- read_html(html2)

purrr::map_chr(page2 |> html_elements('p_item, e_item'), ~ .x |> html_element('id, e_id') |> html_text()) 

但是在这种情况下不需要额外的库。你可以使用*申请。

代码语言:javascript
复制
sapply(page2 |> html_elements('p_item, e_item'), function(x) html_element(x, 'id, e_id') |> html_text())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74042331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档