gpt4 book ai didi

r - 从维基百科的一个部分中抓取表格

转载 作者:行者123 更新时间:2023-12-03 15:55:17 26 4
gpt4 key购买 nike

我正在尝试想出一个可靠的方法来在每个赛季中争夺 NFL 球队的最终排名;奇妙的是,有a Wikipedia page包含指向所有这些信息的链接。

不幸的是,最终排名表的存储方式/位置存在很多不一致(考虑到联赛结构的演变,这可能是意料之中的)。

可取之处应该是相关表格始终位于带有“Standings”一词的部分中。

有什么方法可以grep 部分名称并只提取那里的 节点吗?

这里有一些示例页面来演示结构:

  • 1922 season - 只有一个分区,一张 table ;表格位于“Standings”标题下,具有 xpath //*[@id="mw-content-text"]/table[2] 和 CSS 选择器 #mw-content-text > table.wikitable.

  • 1950 season - 两个分区,两个表;两者都在“最终排名”标题下找到。首先有 xpath //*[@id="mw-content-text"]/div[2]/table/CSS #mw-content-text > div:nth-child( 20) > table,第二个有 xpath //*[@id="mw-content-text"]/div[3]/table 和选择器 #mw-content -text > div:nth-child(21) > table.

  • 2000 season - 两个 session ,6个分部,两张 table ;两者都在“最终常规赛排名”标题下找到。首先是 xpath //*[@id="mw-content-text"]/div[2]/table 和选择器 #mw-content-text > div:nth-child( 16) > table,第二个有 xpath //*[@id="mw-content-text"]/div[3]/table 和选择器 #mw-content -text > div:nth-child(17) > 表格

总结:

# season |                                   xpath |                                          css
-------------------------------------------------------------------------------------------------
# 1922 | //*[@id="mw-content-text"]/table[2] | #mw-content-text > table.wikitable
# 1950 | //*[@id="mw-content-text"]/div[2]/table | #mw-content-text > div:nth-child(20) > table
# | //*[@id="mw-content-text"]/div[3]/table | #mw-content-text > div:nth-child(21) > table
# 2000 | //*[@id="mw-content-text"]/div[2]/table | #mw-content-text > div:nth-child(16) > table
# | //*[@id="mw-content-text"]/div[3]/table | #mw-content-text > div:nth-child(17) > table

抓取,例如 1922 会很容易:

output <- read_html("https://en.wikipedia.org/wiki/1922_NFL_season") %>%
html_node(xpath = '//*[@id="mw-content-text"]/table[2]') %>% whatever_else(...)

但我没有看到任何可以在 xpath 中使用的模式,也没有看到可以用来概括它的 CSS 选择器,因此我不必进行 80 次单独的抓取练习。

是否有任何可靠的方法来尝试和抓取所有这些表格,特别是考虑到所有表格都位于标题下方的关键洞察力,该标题将从 grepl("standing") 返回 TRUE , tolower(section_title))?

最佳答案

您可以通过使用 lapply 循环 URL 并使用精心选择的 XPath 选择器拉取表格来一次抓取所有内容:

library(rvest)

lapply(paste0('https://en.wikipedia.org/wiki/', 1920:2015, '_NFL_season'),
function(url){
url %>% read_html() %>%
html_nodes(xpath = '//span[contains(@id, "tandings")]/following::*[@title="Winning percentage" or text()="PCT"]/ancestor::table') %>%
html_table(fill = TRUE)
})

XPath 选择器寻找

  • //span[contains(@id, "tandings")]
    • 所有带有 idspan 中包含 tandings(例如“Standings”、“Final standings”)
  • /following::*[@title="Winning percentage"or text()="PCT"]
    • 在 HTML 中它后面有一个节点
      • “获胜百分比”的 title 属性
      • 或包含“PCT”
  • /ancestor::table
    • 并从该节点选择树上的 table 节点。

关于r - 从维基百科的一个部分中抓取表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36538366/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com