【问题标题】:Xpath, R: select nodes whose attribute values match a value in an array/vectorXpath,R:选择属性值与数组/向量中的值匹配的节点
【发布时间】:2021-09-20 13:25:55
【问题描述】:

我有以下代码

<paragraph id = "xx">
<text>hello</text>
</paragraph>

<paragraph id = "yy">
<text>bonjour</text>
</paragraph>

<paragraph id = "zz">
<text>guten Tag</text>
</paragraph>

我也有以下向量

id_vector <- c("xx","zz")

我想获取属性id为“xx”或“zz”的段落节点中的文本,即获取一个字符向量

c("hello","guten Tag")

什么是适合与 rvest 一起使用的 XPath? 到目前为止,我已经尝试了以下XPath,但无济于事

"//paragraph[@id = id_vector]/text"

非常感谢您的帮助!

【问题讨论】:

  • 这行得通吗? "//段落[@id = 'xx' or @id = 'zz']/text"
  • 这很好用,非常感谢。但我很想迭代该过程,并使其适用于包含超过 2 个字符串的数组。您对我如何实现这一目标有任何想法吗?
  • @id 属性是否可以通过某种方式或遵循某种模式进行预测?
  • 如果您不介意将 xpath 粘贴在一起(或者 glue/stringr::str_glue 函数应该更容易),您可以使用 paste(paste("@id", id_vector, sep = "="), collapse = " or ") 之类的内容创建内部部分
  • @LMC 不,它们只是随机数 ID

标签: r xpath


【解决方案1】:

我最初的建议是忽略了 ID 需要在 xpath 中用引号括起来的事实,所以我继续将整个事情放在一起。请注意,我添加了一个 &lt;doc&gt; 标记作为虚拟标记,因为 xml 示例需要一个父节点。将您的 ID 与 @id= 一起粘贴,折叠到您的 xpath 字符串中,然后像往常一样提取文本。

library(xml2)
doc <- read_xml('
<doc>
<paragraph id = "xx">
<text>hello</text>
</paragraph>

<paragraph id = "yy">
<text>bonjour</text>
</paragraph>

<paragraph id = "zz">
<text>guten Tag</text>
</paragraph>
</doc>
')

id_vector <- c("xx","zz")
tags <- paste(stringr::str_glue("@id='{id_vector}'"), collapse = " or ")
xpath <- sprintf("//paragraph[%s]", tags)
xpath
#> [1] "//paragraph[@id='xx' or @id='zz']"
xml_text(xml_find_all(doc, xpath))
#> [1] "hello"     "guten Tag"

【讨论】:

    猜你喜欢
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    相关资源
    最近更新 更多