我正在尝试选择一个节点集并从子节点中提取文本。然而,源XML并不具有严格的结构。项目可以是两种类型,文本要在两个不同的节点中提取。下面是简化的示例。
<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编译节点集。在最后一步,我想使用
xml_find_all(id | e_id) %>%
xml_text()并将相同长度的字符向量绑定到最终数据。有人有过类似问题的经验吗?谢谢你分享你的知识。
发布于 2022-10-29 20:26:51
不知道像目前所说的那样,purrr在哪里出现了问题。您可以根据感兴趣的类型选择器值将需求写入css选择器列表,并指定与组合器(例如后代组合器)之间的关系。选择器列表中的“,”允许在可以匹配左或右模式的情况下进行OR选择。
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。
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()) 但是在这种情况下不需要额外的库。你可以使用*申请。
sapply(page2 |> html_elements('p_item, e_item'), function(x) html_element(x, 'id, e_id') |> html_text())https://stackoverflow.com/questions/74042331
复制相似问题