我有兴趣在basketball-reference.com上提取播放器表格。我已成功提取特定玩家的每场比赛统计表(例如LeBron James,作为示例),这是网页上列出的第一个表。但是,页面上有10多个表,我似乎无法提取。我已经能够以不同的方式将表格放入R中。首先,使用rvest包:
library(rvest)
lebron <- "https://www.basketball-reference.com/players/j/jamesle01.html"
lebron_webpage <- read_html(lebron)
lebron_table <- html_table(lebron_webpage, fill = TRUE)
lebron_pergame <- data.frame(lebron_table)
现在我在勒布朗的职业生涯中有一个很好的数据框架。我也可以使用XML和RCurl包的组合来读取同一个表。
library(RCurl)
library(XML)
lebron_url <- paste0(lebron)
lebron_url <- getURL(lebron_url)
lebron_table <- readHTMLTable(lebron_url, which = 1)
如果我想在页面上的其他表中阅读,则会出现问题。例如,页面上的下一个表是Totals。我已经尝试使用CSS选择器来选择我想要读取的特定表,但我无法让它工作。我也尝试右键单击,检查页面上的元素并复制表的XPath,但我也无法使其工作。我花了很多时间在Google上研究这个问题,但似乎无法找到解决这个问题的任何东西。任何帮助将不胜感激!提前谢谢!
答案 0 :(得分:0)
以下表格是动态加载的(js)。因此,您有很多可能来提取表格。
使用RSelenium模拟用户导航:
library(rvest)
library(RSelenium)
lebron <- "https://www.basketball-reference.com/players/j/jamesle01.html"
rD <- rsDriver()
remDr <- rD[["client"]]
remDr$navigate(lebron)
lebron_webpage <- read_html(remDr$getPageSource()[[1]])
lebron_table <- html_table(lebron_webpage, fill = TRUE)
for (i in 1:length(lebron_table))
assign(paste0("table_",i),data.frame(lebron_table[i]))
#You can rename your table by a title to be more explicit
另一种方法是收集js事务并查看是否可以获得json结果。
希望这会有所帮助
Gottavianoni
答案 1 :(得分:0)
这是从另一个post中得到的部分答复,只是将其转发给其他人,在体育参考网站中,不是第一张表的任何内容都被列为评论表,因此我们必须提取评论,然后提取数据框-在这种情况下,您要输入的是“总计”表。
toggleRememberMe = value => {
this.setState({ rememberMe: value })
if (value === true) {
//user wants to be remembered.
this.rememberUser();
} else {
this.forgetUser();
}
}
// function to save username
rememberUser = async () => {
try {
await AsyncStorage.setItem('user_userID', this.state.signInEmail);
} catch (error) {
console.log(error)
}
};
// function to get username
getRememberedUser = async () => {
try {
const username = await AsyncStorage.getItem('user_userID');
if (username !== null) {
return username;
}
} catch (error) {
console.log(error)
}
};
// function to forget username or remove
forgetUser = async () => {
try {
await AsyncStorage.removeItem('user_userID');
} catch (error) {
console.log(error)
}
};
// componentDidMount
async componentDidMount() {
const username = await this.getRememberedUser();
console.log(username)
this.setState({
signInEmail: username || "",
rememberMe: username ? true : false });
}
//render
<Switch
trackColor={{true: '#16752A'}}
value={this.state.rememberMe}
onValueChange={(value) => this.toggleRememberMe(value)}
/>
<Text>Remember Me</Text>