在 R 中使用 readHTMLTable 删除行

2024-04-06

我正在尝试使用 readHTMLTable 从 NOAA 提取模型数据。据我从 HTML 中可以看出,我试图获取的表格有多个字幕,其中每个字幕都由跨越所有列的单个单元格组成。由于某种原因,这导致 readHTMLTable 忽略紧随副标题的行。以下是重现该问题的代码:

library(XML)

url <- "http://nomads.ncep.noaa.gov/"
ncep.tables = readHTMLTable(url, header=TRUE)

#Find the list of real time models
for(ncep.table in ncep.tables) {
    if("grib filter" %in% names(ncep.table) & "gds-alt" %in% names(ncep.table)) {
        rt.tbl <- ncep.table
     }
}

#Here's where the problem is:
cat(paste(rt.tbl[["Data Set"]][15:20], collapse = "\n"))

#On the website, there is a model called "AQM Daily Maximum"
#between Regional Models and AQM Hourly Surface Ozone
#but it's missing now...

所以,如果你去http://nomads.ncep.noaa.gov/ http://nomads.ncep.noaa.gov/查看中央表格(右上角单元格中带有“数据集”的表格),您会看到一个名为“区域模型”的副标题。在上述代码的提取过程中,会跳过紧邻副标题下方的 AQM Daily Maximum 模型。

我在 R 中维护 rNOMADS 包,因此如果我能让它正常工作,它将节省我维护该包的大量时间,并为我的用户保持准确和最新。感谢您的帮助!


天哪,我想我明白了。您将无法使用readHTMLTable(而且,我现在比以前更了解 XML 包代码......该代码中存在一些严重的 R-fu)并且我正在使用rvest只是因为我混合使用了 XPath 和 CSS 选择器(不过我最终更多地考虑了 XPath)。dplyr只为gimpse.

library(XML)
library(dplyr)
library(rvest)

trim <- function(x) gsub("^[[:space:]]+|[[:space:]]+$", "", x)

# neither rvest::html nor rvest::html_session liked it, hence using XML::htmlParse
doc <- htmlParse("http://nomads.ncep.noaa.gov/")

ds <- doc %>% html_nodes(xpath="//table/descendant::th[@class='nomads'][1]/../../
                                            descendant::td[contains(., 'http')]/
                                            preceding-sibling::td[3]")

data_set <- ds %>% html_text() %>% trim()
data_set_descr_link <- ds %>% html_nodes("a") %>% html_attr("href")

freq <- doc %>% html_nodes(xpath="//table/descendant::th[@class='nomads'][1]/../../
                           descendant::td[contains(., 'hourly') or
                                          contains(., 'hours') or
                                          contains(., 'daily') or
                                          contains(., '06Z')]") %>%
  html_text() %>% trim()

grib_filter <- doc %>% html_nodes(xpath="//table/descendant::th[@class='nomads'][1]/../../
                                  descendant::td[contains(., 'http')]/preceding-sibling::td[1]") %>%
  sapply(function(x) {
    ifelse(x %>% xpathApply("boolean(./a)"),
           x %>% html_node("a") %>% html_attr("href"),
           NA)
  })

http_link <- doc %>% html_nodes("a[href^='/pub/data/']") %>% html_attr("href")

gds_alt <- doc %>% html_nodes(xpath="//table/descendant::th[@class='nomads'][1]/../../
                              descendant::td[contains(., 'http')]/following-sibling::td[1]") %>%
  sapply(function(x) {
    ifelse(x %>% xpathApply("boolean(./a)"),
           x %>% html_node("a") %>% html_attr("href"),
           NA)
  })

nom <- data.frame(data_set,
                  data_set_descr_link,
                  freq,
                  grib_filter,
                  gds_alt)

glimpse(nom)

## Variables:
## $ data_set            (fctr) FNL, GFS 1.0x1.0 Degree, GFS 0.5x0.5 Degr...
## $ data_set_descr_link (fctr) txt_descriptions/fnl_doc.shtml, txt_descr...
## $ freq                (fctr) 6 hours, 6 hours, 6 hours, 12 hours, 6 ho...
## $ grib_filter         (fctr) cgi-bin/filter_fnl.pl, cgi-bin/filter_gfs...
## $ gds_alt             (fctr) dods-alt/fnl, dods-alt/gfs, dods-alt/gfs_...

head(nom)

##                             data_set
## 1                                FNL
## 2                 GFS 1.0x1.0 Degree
## 3                 GFS 0.5x0.5 Degree
## 4                 GFS 2.5x2.5 Degree
## 5       GFS Ensemble high resolution
## 6 GFS Ensemble Precip Bias-Corrected
##
##                                             data_set_descr_link     freq
## 1                                txt_descriptions/fnl_doc.shtml  6 hours
## 2                txt_descriptions/GFS_high_resolution_doc.shtml  6 hours
## 3                    txt_descriptions/GFS_half_degree_doc.shtml  6 hours
## 4                 txt_descriptions/GFS_Low_Resolution_doc.shtml 12 hours
## 5       txt_descriptions/GFS_Ensemble_high_resolution_doc.shtml  6 hours
## 6 txt_descriptions/GFS_Ensemble_precip_bias_corrected_doc.shtml    daily
##
##                       grib_filter          gds_alt
## 1           cgi-bin/filter_fnl.pl     dods-alt/fnl
## 2           cgi-bin/filter_gfs.pl     dods-alt/gfs
## 3        cgi-bin/filter_gfs_hd.pl  dods-alt/gfs_hd
## 4       cgi-bin/filter_gfs_2p5.pl dods-alt/gfs_2p5
## 5          cgi-bin/filter_gens.pl    dods-alt/gens
## 6 cgi-bin/filter_gensbc_precip.pl dods-alt/gens_bc

请确保列匹配。我盯着看,但验证一下就太好了。注意:可能有更好的方法来做到这一点sapply(任何人都可以随意编辑它,相信自己)。

It's really脆弱的代码。也就是说,如果格式发生变化,它就会发出嘎嘎声(但对于所有抓取来说都是如此)。它应该能够承受他们实际创建有效的 HTML(顺便说一句,这是可悲的 HTML),但大多数代码依赖于http自此之后该列仍然有效most其他列的提取依赖于它。您丢失的模型也在那里。如果任何 XPath 令人困惑,请发表评论 q,我会尝试“解释”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 R 中使用 readHTMLTable 删除行 的相关文章

随机推荐

  • 在 Javascript 中将变量名转换为字符串?

    我在 Stack Overflow 上看到过一些关于此问题的其他帖子 但答案似乎总是创建一个带有键 值对的对象 这似乎不是我目前的情况所需要的 我想要做什么 我有不同的数组 其中可能包含用户名 我想检查每个数组 看看用户名是否作为其中的值存
  • 哪些错误适用于不同的 FindBugs 报告级别?

    根据 Ant 任务 报告级别是低 中 高设置 用于查找不同严重程度级别的错误 然而 我找不到任何东西可以解释哪些错误适用于这些不同的报告级别 是否有某个地方可以提供此功能 即使我需要在源代码中查看它 不幸的是 错误类型和优先级之间的关联存在
  • SwiftUI UIViewRepresentable UITextView 绑定

    目前 SwiftUI 本身不支持多行文本输入 希望很快就会添加此功能 所以我一直在尝试使用组合框架来实现 UIKit 中的 UITextView 它支持多行输入 但是我得到的结果好坏参半 这是我创建的用于制作文本视图的代码 struct M
  • 使用默认值初始化方法的参数

    如果未将显式值传递到方法中 我想用一些默认值初始化方法的参数 如下所示 class Example def init self data self default data self data data def default data r
  • Safari 上使用 React 的日期选择器

    我的应用程序使用 Form Input 来自语义 UI 反应 https react semantic ui com collections form 库插入日期 它在 Chrome 和 Firefox 上显示日期选择器 但在 Safari
  • 在 django-oscar 中集成包含重定向的付款方式

    我正在使用 django oscar 框架开发一个购物网站 实际上我正在使用他们的沙箱网站 我想在结帐流程中添加付款功能 但问题是 我完全困惑了 我已阅读此链接 奥斯卡的支付集成文档 http django oscar readthedoc
  • 如何摆脱 Eclipse 查找/替换栏

    For searching a document I like using the floating Find Replace window that pops up Lately however hitting command F pul
  • 使用 Phonegap 启动图像后白屏闪烁

    加载启动图像后 在加载应用程序之前我会看到一个白屏 我正在将phonegap 与xcode 结合使用 我希望我的应用程序加载到我的启动图像上 以便它遵循 ios 开发人员指南并提供流畅的启动体验 我认为这个白屏是我的应用程序加载的网络视图
  • 从具体类派生抽象类

    假设我们有一个具体的class Apple Apple 对象可以被实例化 现在 有人来导出一个摘要class Peach来自苹果 它是抽象的 因为它引入了新的纯虚函数 Peach 的用户现在被迫从它派生并定义这个新函数 这是常见的模式吗 这
  • 将模型引用添加到现有 Rails 模型

    我想知道在两个之间添加关系的 正确 方法existingRails 3 中的类 给定现有模型 小丑和兔子 我想添加从兔子到小丑的引用 belongs to 我首先尝试生成迁移 rails g migration AddClownToRabb
  • SwitchPreferenceCompat:android:switchTextOff / switchTextOn 不起作用

    我正在尝试显示一个 switchPreference 它允许用户根据英里或公里显示距离 我正在使用 SwitchPreferenceCompat 支持库 根据该库 我可以使用 textSwitchOff 和 textSwitchOn 将文本
  • 如何使用 SwiftUI 获得动态视图列表

    我可以做一个静态列表 比如 List View1 View2 但是如何从数组中创建元素的动态列表呢 我尝试了以下但出现错误 包含控制流语句的闭包不能与函数生成器 ViewBuilder 一起使用 let elements Any View1
  • @WebMvcTest 由于缺少依赖项而未运行

    我想使用以下方法测试我的控制器 WebMvcTest I MockBean控制器的依赖项 但运行测试时 无法启动 运行主类时应用程序正确启动 考试 RunWith SpringRunner class WebMvcTest MetricRe
  • 将字符串转义为 sed 替换模式

    在我的 bash 脚本中 我有一个外部 从用户接收的 字符串 我应该在 sed 模式中使用它 REPLACE
  • 如何使用脚本任务声明工作表?

    我试图声明一个工作表来处理 xlsx 文件的单元格 但当我声明工作表对象时 我的 C 脚本失败 Microsoft Office Interop Excel Application xlApp new Microsoft Office In
  • 为什么 java.security.NoSuchProviderException 没有这样的提供者:BC?

    jar bcprov jdk16 145 jar 已添加到项目中 Security addProvider new org bouncycastle jce provider BouncyCastleProvider 已添加到类中 并且Bo
  • Spark清理shuffle溢出到磁盘

    我有一个循环操作 它生成一些 RDD 进行重新分区 然后进行聚合键操作 循环运行一次后 它会计算出最终的 RDD 该 RDD 会被缓存和检查点 并用作下一次循环的初始 RDD 这些 RDD 非常大 并且在每次迭代到达最终 RDD 之前都会生
  • 如何在android studio中添加轮廓材质图标?

    我正在使用 android 材质图标插件 但没有 轮廓图标 选项 任何选项或任何其他插件 目前我正在使用 https github com konifar android material design icon generator plu
  • Pandas 替换非零值

    我知道我可以用以下内容替换所有 nan 值df fillna 0 并将单个值替换为df replace 1 但是如何用单个值替换所有非零值 使用布尔索引 df df 0 value
  • 在 R 中使用 readHTMLTable 删除行

    我正在尝试使用 readHTMLTable 从 NOAA 提取模型数据 据我从 HTML 中可以看出 我试图获取的表格有多个字幕 其中每个字幕都由跨越所有列的单个单元格组成 由于某种原因 这导致 readHTMLTable 忽略紧随副标题的