使用XML关联子节点和父节点的值

2024-03-17

使用 R 的 XML 包时,如何保留与该节点关联的某个节点的数据,例如在同一个列表中?我正在尝试将从网络上抓取的数据放入数据框中,并将相关信息分组为行。有<span>没有类属性来区分的元素,可能有一个或两个<span>位于每个相关组(数据框的行)中。

这是我另存为的一些示例 htmlhtml_example.html.

<!DOCTYPE html>
<html>
    <body>
        <div class="foo">
            <div class="fooname">Name of 1st foo</div>
            <span>1st span in 1st foo</span>
            <span>2nd span in 1st foo</span>
        </div>

        <div class="foo">
            <div class="fooname">Name of 2nd foo</div>
            <span>Only 1 span in 2nd foo</span>
        </div>
    </body>
</html>

这是当前的解析代码和输出:

library(XML)

html <- readLines("html_example.html")
parse <- htmlParse(html)

fooname <- xpathSApply(parse, "//div[@class='foo']/div[@class='fooname']"
    , xmlValue)
print(fooname)

    # > print(fooname)
    # [1] "Name of 1st foo" "Name of 2nd foo"

span <- xpathSApply(parse, "//div[@class='foo']/span"
    , xmlValue)
print(span)

    # >     print(span)
    # [1] "1st span in 1st foo"    "2nd span in 1st foo"    "Only 1 span in 2nd foo"

目前无法关联“fooname”和“span”的值。有没有办法让抓取输出看起来像这样?

foo1 <- list(fooname[1], span[1:2])
foo2 <- list(fooname[2], span[3])
list1 <- list(foo1, foo2)
list1

    # > mylist
    # [[1]]
    # [[1]][[1]]
    # [1] "Name of 1st foo"
    # 
    # [[1]][[2]]
    # [1] "1st span in 1st foo" "2nd span in 1st foo"
    # 
    # 
    # [[2]]
    # [[2]][[1]]
    # [1] "Name of 2nd foo"
    # 
    # [[2]][[2]]
    # [1] "Only 1 span in 2nd foo"

最终,在抓取过程中没有必要,我想创建一个如下所示的数据框。 NA的相关讨论here https://stackoverflow.com/questions/29188801/using-ldply-with-unequal-lengths-from-strsplit/29189798#29189798:

FooNames <- c(fooname[1], fooname[2])
Span1 <- c(span[1], span[3])
Span2 <- c(span[2], NA)
df <- data.frame(FooNames, Span1, Span2, stringsAsFactors = FALSE)
df

    # > df
    #          FooNames                  Span1               Span2
    # 1 Name of 1st foo    1st span in 1st foo 2nd span in 1st foo
    # 2 Name of 2nd foo Only 1 span in 2nd foo                <NA>

您可以将函数应用于每个感兴趣的节点(div[class="foo"]在这种情况下)。一个简单的示例采用每个节点并将 xmlValue 应用于div class="fooname" and span子节点。然后它返回这些值作为data.frame。您可以将生成的 data.frames 绑定在一起以获得所需的结果:

'<!DOCTYPE html>
<html>
    <body>
        <div class="foo">
            <div class="fooname">Name of 1st foo</div>
            <span>1st span in 1st foo</span>
            <span>2nd span in 1st foo</span>
        </div>

        <div class="foo">
            <div class="fooname">Name of 2nd foo</div>
            <span>Only 1 span in 2nd foo</span>
        </div>
    </body>
</html>' -> appData
doc <- htmlParse(appData)
myFunc <- function(x){
  div <- xpathSApply(x, "./div[@class='fooname']", fun = xmlValue)
  span <- xpathSApply(x, "./span", fun = xmlValue)
  data.frame(FooNames = div, Span1 = span[1], Span2 = span[2])
}
res <- doc["//*/div[@class='foo']", fun = myFunc]

> do.call(rbind, res)
FooNames                  Span1               Span2
1 Name of 1st foo    1st span in 1st foo 2nd span in 1st foo
2 Name of 2nd foo Only 1 span in 2nd foo                <NA>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用XML关联子节点和父节点的值 的相关文章

  • 如何在 Spring 属性中进行算术运算?

  • 删除字符串末尾的句点和数字

    如何删除尾随句点 后面紧跟一个数字 长度为一位或两位数字 例子 z lt c awe p 56 red 45 ted 5 you 88 tom 我只想删除 45和 5 你只需要一个简单的正则表达式 z new gsub 0 9 z 一些评论
  • 对 data.table 中的列表列执行操作

    假设我有一个data table 例如dt lt data table foo list 1 3 4 6 bar c 2 7 如何使用 dt 框架对 foo 向量列表执行操作 操作可能是将 bar 添加到 foo 返回列表 3 5 11 1
  • 如何在ubuntu的conda环境中更改Rstudio中的R版本

    我在基本系统中安装了 R 4 3 和 Rstudio 在 conda 环境中安装了旧版本的 R 4 2 3 命令which R返回环境中安装的 R 的目录 home 用户 miniconda3 envs anndata2ri pip bin
  • 使用 dpi 与 dp 缩放图像之间的差异

    我拥有所有由九个补丁位图组成的 dpi 可绘制目录 xxhdpi 和 xxxhdpi 是否必要 可绘制目录中的可绘制资源文件可检索所有缩放的位图 并且我使用可绘制资源文件 现在 我的问题是我还根据大小 小 正常等 创建了 缩放 布局目录 其
  • 如何在knitr和RStudio中为word和html设置不同的全局选项?

    我正在使用 RStudio 0 98 932 和 knitr 1 6 想要为word和html设置不同的全局knitr选项 例如 想要将word的fig width和fig height设置为6 html的fig width和fig hei
  • randomForest 包在删除一个预测类时的奇怪行为

    我正在运行一个随机森林模型 它产生的结果从统计角度来看对我来说完全没有意义 因此我确信有些东西mustrandomForest 包的代码出现错误 至少在模型的本次迭代中 预测 左侧变量是具有 3 种可能结果的政党 ID 民主党 独立党 共和
  • 将字符串列拆分为多个虚拟变量

    作为 R 中 data table 包的相对缺乏经验的用户 我一直在尝试将一个文本列处理为大量指示符列 虚拟变量 每列中的 1 表示特定的子字符串是在字符串列中找到 例如我想处理这个 ID String 1 a b 2 b c 3 c 进入
  • 使用 R 下载压缩数据文件、提取和导入数据

    EZGraphs 在 Twitter 上写道 很多在线 csv 都被压缩了 有没有办法下载 解压缩存档并使用 R 将数据加载到 data frame Rstats 我今天也尝试这样做 但最终只是手动下载 zip 文件 我尝试过类似的东西 f
  • 尝试使用 JRI 将 R 与我的 Java 应用程序集成,但出现错误。谁能解释一下原因和解决办法吗?

    我需要将 Java 与 R 集成来运行一些数学命令并使用 R 的功能进行绘图 以下部分代码给出了错误 public static void main String args HelloRWorld r new HelloRWorld r h
  • R中的重叠矩阵

    我有以下数据框 id channel 1 a 1 b 1 c 2 a 2 c 3 a 我想创建并重叠矩阵 它基本上是一个方阵 行和列标签为 a b c 表中的每个条目显示每个通道共有多少个 id 例如 在上面的例子中 矩阵看起来像 a b
  • purrr::可能函数可能无法与map2_chr函数一起使用

    我怀疑这是 purrr 包中的错误 但想先在 StackOverflow 中检查我的逻辑 在我看来 possibly功能在内部不起作用map2 chr功能 我正在使用 purrr 版本 0 2 5 考虑这个例子 library dplyr
  • R 中两个时间戳之间的左连接

    我的目标是执行左连接intervals哪里的bike id比赛和created at时间戳在records在 之间start and end in the intervals table gt class records 1 data ta
  • 正态分布平均值的贝叶斯推理玩具 R 代码 [降雪量数据]

    我有一些降雪观测 x lt c 98 044 107 696 146 050 102 870 131 318 170 434 84 836 154 686 162 814 101 854 103 378 16 256 我被告知它遵循正态分布
  • 警告消息 - 来自 dummies 包的 dummy

    我正在使用 dummies 包为分类变量生成虚拟变量 其中一些变量具有两个以上类别 testdf lt data frame A as factor c 1 2 2 3 3 1 B c A B A B C C C c D D E D D E
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 需要在R中按行绑定列表数据

    我在 R 中按行绑定列表时遇到问题 我的列表数据集是 id 1 data k 1 id k b c 1 1 1 3 data k 2 id k b c 1 2 1 4 id 2 data k 1 id k b c 2 1 1 6 data
  • 如何使用C#在asp.net中下载xml文件

    我正在使用网络应用程序ASP NET 与 MVC3 我是 mvc3 的新手 我的网页上有一个下载按钮 当我要单击下载按钮时 我希望能够打开该 XML 文件 我尝试过一些代码更改动作结果但我没有打开文件 通过使用下面提到的代码 我收到一个下载
  • 在R中循环子文件夹

    我正在 R 环境中包含多个子文件夹的文件夹中工作 我想要循环遍历多个子文件夹 然后在每个子文件夹中调用 R 脚本来执行 我想出了下面的代码 但我的代码似乎添加了 到子文件夹列表 我收到错误 文件中的错误 文件名 r 编码 编码 无效的 描述
  • dbms_xmlgen.getxml - 如何设置日期格式

    我们使用 dbms xmlgen getxml 实用程序通过 SQL 查询生成 xml 该查询从几乎 10 15 个相关表中获取数据 默认情况下 日期格式生成于dd MMM yy格式 有什么方法可以在 dbms xmlgen getxml

随机推荐