我正试图想出一个强有力的方法来在每个赛季中击败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))
?
答案 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")]
个span
且id
(例如“排名”,“最终排名”)tandings
/following::*[@title="Winning percentage" or text()="PCT"]
属性title
/ancestor::table
节点。