Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 在R中使用readHTMLTable删除行_Xml_R_Web Scraping - Fatal编程技术网

Xml 在R中使用readHTMLTable删除行

Xml 在R中使用readHTMLTable删除行,xml,r,web-scraping,Xml,R,Web Scraping,我正在尝试使用readHTMLTable从NOAA提取模型数据。我试图获取的表有多个副标题,其中每个副标题由一个单元格组成,跨越所有列,从HTML中可以看出。出于某种原因,这会导致readHTMLTable忽略紧接着副标题的行。下面是重现问题的代码: library(XML) url <- "http://nomads.ncep.noaa.gov/" ncep.tables = readHTMLTable(url, header=TRUE) #Find the list of real

我正在尝试使用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...
因此,如果您转到并查看中央表格,即右上角单元格中有数据集的表格,您将看到一个名为“区域模型”的副标题。在上述代码中提取期间,将跳过字幕正下方的AQM每日最大值模型


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

天哪,我想我明白了。您将无法使用readHTMLTable,而且,我现在比以前更了解XML包代码……代码中有一些严肃的R-fu,我之所以使用rvest,只是因为我混合使用了XPath和CSS选择器,最后我更多地考虑了XPath。dplyr仅适用于gimpse

请确保列匹配。我看了一下,但核实一下就太棒了。注意:也许有更好的方法来做sapplys,任何人都可以自由地编辑它,这也归功于你自己


这是非常脆弱的代码。i、 如果格式改变,它会发出嘎嘎声,但对于所有的刮削来说都是这样。它应该能够承受他们实际创建有效的HTML这是可怜的HTML顺便说一句,但大多数代码依赖于http列保持有效,因为大多数其他列提取依赖于它。你丢失的模型也在那里。如果XPath中有任何一个让人困惑,请删除注释q,我将尝试“splain”

有时您只需修复糟糕的HTML,就可以将tr标记添加到这些行的开头

url <- "http://nomads.ncep.noaa.gov/"
x <- readLines(url, encoding="UTF-8")
doc <- htmlParse(x)

# check nodes after subheaders - only 2 of 5 rows missing tr (2nd and 3rd element)
getNodeSet(doc, "//td[@colspan='7']/../following-sibling::*[1]")
# fix text - probably some way to fix XML doc too?
n <- grep(">AQM Daily Maximum<", x)
x[n] <- paste0("<tr>", x[n])
n <- grep(">RTOFS Atlantic<", x)
x[n] <- paste0("<tr>", x[n])

doc <- htmlParse(x)
## ok..
getNodeSet(doc, "//td[@colspan='7']/../following-sibling::*[1]")
readHTMLTable(doc, which=9, header=TRUE)

                                      Data Set     freq grib filter http     gds-alt
1                                 Global Models     <NA>        <NA> <NA>        <NA>
2                                           FNL  6 hours grib filter http OpenDAP-alt
3                            GFS 1.0x1.0 Degree  6 hours grib filter http OpenDAP-alt
...
16 Climate Forecast System 3D Pressure Products  6 hours grib filter http           -
17                              Regional Models     <NA>        <NA> <NA>        <NA>
18                            AQM Daily Maximum 06Z, 12Z grib filter http OpenDAP-alt
19                     AQM Hourly Surface Ozone 06Z, 12Z grib filter http OpenDAP-alt
20                                 HIRES Alaska    daily grib filter http OpenDAP-alt

相关报道:你可以在这两篇文章中的一篇找到答案。我对这两篇文章都进行了研究。设置header=FALSE无法解决我的问题。该页面上的HTML格式不正确。缺少的行没有像应该的那样包含在标记中。这使得表很难解析。您决定如何解决这一问题可能完全取决于您试图从文档中提取的内容。哇。所有通常的简单解决方法都无法克服糟糕的HTML表,但我认为下面的答案可以为您提供所有列。你知道有什么方法可以让NOAA修复页面上的HTML吗?谢谢-很快就会出来,我会回来告诉你的-你是一个向导-代码工作得很好。新版本的rNOMADS现在正在CRAN上。我在代码文档中添加了一个确认。非常感谢!是的,但我希望代码保持足够的灵活性,以捕获行的添加和删除。如果我将其设置为单个模型,则会有点不稳定。
url <- "http://nomads.ncep.noaa.gov/"
x <- readLines(url, encoding="UTF-8")
doc <- htmlParse(x)

# check nodes after subheaders - only 2 of 5 rows missing tr (2nd and 3rd element)
getNodeSet(doc, "//td[@colspan='7']/../following-sibling::*[1]")
# fix text - probably some way to fix XML doc too?
n <- grep(">AQM Daily Maximum<", x)
x[n] <- paste0("<tr>", x[n])
n <- grep(">RTOFS Atlantic<", x)
x[n] <- paste0("<tr>", x[n])

doc <- htmlParse(x)
## ok..
getNodeSet(doc, "//td[@colspan='7']/../following-sibling::*[1]")
readHTMLTable(doc, which=9, header=TRUE)

                                      Data Set     freq grib filter http     gds-alt
1                                 Global Models     <NA>        <NA> <NA>        <NA>
2                                           FNL  6 hours grib filter http OpenDAP-alt
3                            GFS 1.0x1.0 Degree  6 hours grib filter http OpenDAP-alt
...
16 Climate Forecast System 3D Pressure Products  6 hours grib filter http           -
17                              Regional Models     <NA>        <NA> <NA>        <NA>
18                            AQM Daily Maximum 06Z, 12Z grib filter http OpenDAP-alt
19                     AQM Hourly Surface Ozone 06Z, 12Z grib filter http OpenDAP-alt
20                                 HIRES Alaska    daily grib filter http OpenDAP-alt