【发布时间】:2021-11-01 09:51:18
【问题描述】:
rvest 似乎没有提供任何仅从父对象中提取文本的方法(忽略子对象)。一个workaround 使用xml_remove(),它会改变原始对象——给定R 的默认惰性求值,一直沿内存链向上。
我查看rlang::duplicate(),它被认为是“修改副本使原始对象保持不变”,但克隆似乎并不是真正独立的。例如:
require(rvest)
h = '<ul>
<li id="target">
text to extract
<ul><li>text to ignore</li><li>this too</li></ul>
</li>
</ul>'
doc = xml2::read_html(h)
x = html_node(doc, '#target')
html_text(x)
#> [1] "\ntext to extract\ntext to ignorethis too"
现在克隆 x,移除它的子节点,然后提取文本:
x2 = rlang::duplicate(x, shallow = FALSE)
children = html_children(x2)
xml2::xml_remove(children)
html_text(x2)
#> [1] "\ntext to extract\n"
这可以按预期工作,但是 x 也发生了变异:
html_text(x)
#> [1] "\ntext to extract\n"
任何建议为什么以及如何解决这个问题?我不想开始重新连接孩子..
【问题讨论】:
-
data.table::copy()提供相同的结果。