【问题标题】:Rvest R not getting inner tableRvest R没有得到内表
【发布时间】:2015-07-27 04:16:05
【问题描述】:

我正在尝试检索 2012 年奥运会维基百科中的奖牌表。

library(rvest) 
library(magrittr)
url <- "https://en.wikipedia.org/wiki/United_States_at_the_2012_Summer_Olympics" 

    xpath0 <- '//*[@id="mw-content-text"]/table[1]'
    xpath1 <- '//*[@id="mw-content-text"]/table[2]'
    xpath2 <- '//*[@id="mw-content-text"]/table[2]/tbody/tr/td[1]'
    xpath3 <- '//*[@id="mw-content-text"]/table[2]/tbody/tr/td[1]/table'

    tb <- url %>%
      html() %>%
      html_nodes(xpath=xpath0) %>%
      html_nodes("") %>%
      html_table()

xpath0 或 xpath1 返回错误

Error in parse_simple_selector(stream) : 
  Expected selector, got <EOF at 1>

xpath2 和 xpath3 返回空列表。

同时我尝试使用 Selectorgadget (https://cran.r-project.org/web/packages/rvest/vignettes/selectorgadget.html) 来指向确切的元素。我得到了

//td[((((count(preceding-sibling::) + 1) = 1) and parent::)] | //*[包含(concat(“”,@class,“”),concat(“”, "headerSortDown", " "))]

和错误

parse_simple_selector(stream) 中的错误: 预期的选择器,得到了

非常感谢任何帮助。

乔亚

【问题讨论】:

  • 我想要的表格是“Medalists”,标题有奖牌名称体育赛事日期的表格。

标签: html r xpath rvest magrittr


【解决方案1】:

带有名称的第一个表结构复杂,似乎很难转换为标准格式。至少我没有成功。

按运动项目的奖牌总数和总奖牌可以通过

获得
library(rvest) #v.0.2.0.9000
url <- "https://en.wikipedia.org/wiki/United_States_at_the_2012_Summer_Olympics" 
tb <- read_html(url) %>% html_node("table.wikitable:nth-child(2)") %>% html_table(fill=TRUE)
#> head(tb)
#   Medals by sport   NA   NA   NA    NA NA NA
#1            Sport 01 ! 02 ! 03 ! Total NA NA
#2         Swimming   16    9    6    31 NA NA
#3    Track & field    9   12    7    28 NA NA
#4       Gymnastics    3    1    2     6 NA NA
#5         Shooting    3    0    1     4 NA NA
#6           Tennis    3    0    1     4 NA NA

然后还有一张表格总结了你可以得到的所有竞争对手

tb2 <- read_html(url) %>% html_node("table.wikitable:nth-child(20)") %>% html_table()
#> head(tb2)
#                        Sport Men Women Total
#1                     Archery   3     3     6
#2 Athletics (track and field)  63    62   125
#3                   Badminton   2     1     3
#4                  Basketball  12    12    24
#5                      Boxing   9     3    12
#6                    Canoeing   5     2     7

这是多个奖牌获得者的表格:

tb3 <- read_html(url) %>%  html_node("table.wikitable:nth-child(8)") %>% html_table(fill=TRUE)
#> head(tb3)
#  Multiple medalists            NA   NA   NA   NA    NA NA
#1               Name         Sport 01 ! 02 ! 03 ! Total NA
#2     Michael Phelps      Swimming    4    2    0     6 NA
#3     Missy Franklin      Swimming    4    0    1     5 NA
#4    Allison Schmitt      Swimming    3    1    1     5 NA
#5        Ryan Lochte      Swimming    2    2    1     5 NA
#6      Allyson Felix Track & field    3    0    0     3 NA

正如@Metrics 所指出的,这实际上取决于您想要拥有哪个表。该页面上有很多表格。

【讨论】:

  • 对不起,我错了。我想要的表格是 Medalists,标题有奖牌名称体育赛事日期。
  • read_html() 是当前的 html()?当我尝试您的示例时,我收到消息 > Error in eval(expr, envir, enclos) : could not find function "read_html"
  • 我得到了它与这个版本的解决方案一起工作t % html_node("table.wikitable:nth-child(1)") %>% html_table( fill=T) 但 child(1) 带来了 3 张桌子,而我想要的是第二个孩子。
  • 嗨!我指出了我正在使用的rvest 的版本,v0.2.0.9000,我相信它是最新的版本。该版本建议使用read_html() 而不是html()。不过,我从来没有注意到两者之间的区别。不幸的是,child(1) 只是我一开始提到的复杂表格,我无法转换为合适的格式。如果我设法取得一些进展,我会更新帖子。
  • 如何定位子号?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多