如果您在浏览器中禁用 javascript,您将看到该内容未加载。如果您随后检查 html,您将看到数据存储在脚本标记中;大概是在浏览器中运行 javascript 时加载到表中的。 Javascript 无法使用您使用的方法运行。您可以从响应 html 中提取数组的 javascript 数组。然后解析成一个数据框。我是 R 的新手,所以研究在这种情况下如何做到这一点。我将在最后包含一个完整的 python 示例。如果我的研究有成果,我会更新。否则,您可以从data 中返回的字符串中正则表达式输出内容。
library(rvest)
library(stringr)
library(magrittr)
url = 'https://www.coinopsy.com/dead-coins/'
r <- read_html(url) %>%
html_node('body') %>%
html_text() %>%
toString()
data <- str_match_all(r,'var table_data = (.*?);')
data <- data[[1]][,2] # string representation of list of lists
#step to convert string to object
#step to convert object to dataframe
在python中有ast库,它使转换变得容易,下面的结果就是你在页面上看到的表格。
import requests
import re
import ast
import pandas as pd
r = requests.get('https://www.coinopsy.com/dead-coins/')
p = re.compile(r'var table_data = (.*?);') #p1 = re.compile(r'(\[".*?"\])')
data = p.findall(r.text)[0]
listings = ast.literal_eval(data)
df = pd.DataFrame(listings)
print(df)
编辑:
目前我找不到可以进行我提到的转换的库。下面是丑陋的组合方式,感觉效率低下。我会欢迎有关改进的建议(尽管这可能会在以后进行代码审查)。我还在看这个,所以会更新。
library(rvest)
library(stringr)
library(magrittr)
url = 'https://www.coinopsy.com/dead-coins/'
headers <- c("Column To Drop","Name","Summary","Project Start Date","Project End Date","Founder","urlId")
# https://www.coinopsy.com/dead-coins/bigone-token/ where bigone-token is urlId
r <- read_html(url) %>%
html_node('body') %>%
html_text() %>%
toString()
data <- str_match_all(r,'var table_data = (.*?);')
data <- data[[1]][,2]
z <- substr(data, start = 2, stop = nchar(data)-1) %>% str_match_all(., "\\[(.*?)\\]")
z <- z[[1]][,2]
for(i in seq(1,length(z))){
if(i==1){
df <- rapply(as.list(strsplit(z[i], ",")[[1]][2:7]), function(x) trimws(sub("'(.*?)'", "\\1", x)))
}else{
df <- rbind(df,rapply(as.list(strsplit(z[i], ",")[[1]][2:7]), function(x) trimws(sub("'(.*?)'", "\\1", x))))
}
}