从维基百科

时间:2016-04-11 01:17:38

标签: r xpath css-selectors rvest

我正试图想出一个强有力的方法来在每个赛季中击败NFL球队的最终排名;奇妙的是,a Wikipedia page提供了所有这些信息的链接。

不幸的是,在最终排名表的存储方式/位置存在很多不一致的情况(考虑到联盟结构的演变,可能会出现这种情况)。

保存宽限 应该是相关的表总是位于带有“Standings”字样的部分。

有什么方法可以grep一个部分名称,只提取那里的table个节点?

以下是一些展示结构的示例页面:

  • 1922 season - 只有一个师,一个表;表格位于标题“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 - 两个会议,6个部门,两个表格;两者均标题为“最终常规赛积分榜”。首先是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) > table

总结:

# 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次单独的刮擦练习。

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

1 个答案:

答案 0 :(得分:1)

您可以通过使用<?php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://api2.online-convert.com/jobs/<your job id here>", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => array( "content-type: application/json", "x-oc-api-key: <your API key here> ), ) ); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; } ?> 循环网址并使用精心选择的XPath选择器拉取表来一次性删除所有内容:

lapply

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) })
    • 所有//span[contains(@id, "tandings")]spanid(例如“排名”,“最终排名”)
  • tandings
    • 在HTML中使用后面的节点
      • “获胜百分比”的/following::*[@title="Winning percentage" or text()="PCT"]属性
      • 或包含“PCT”
  • title
    • 并从该节点中选择树上的/ancestor::table节点。