【发布时间】:2020-12-08 15:40:09
【问题描述】:
我正在尝试从 Python 中的特定网页读取大量表格,并且有点挣扎。我第一次尝试是使用 Pandas read_html,因为它很简单;例如,我将使用这个网站:
https://www.pro-football-reference.com/years/2019/
对于 read_html,我尝试了以下方法:
import pandas as pd
url = 'https://www.pro-football-reference.com/years/2019'
allDfs = pd.read_html(url, header=0)
print(len(allDfs))
这会产生 2 个表的计数。但是,如果您访问该 URL,您会看到有超过 2 个表,并且它们没有被 read_html 函数捕获。
接下来,我尝试使用 requests 和 BeautifulSoup,代码如下:
from bs4 import BeautifulSoup
import requests
url = 'https://www.pro-football-reference.com/years/2019'
r = requests.get(url)
soup = BeautifulSoup(r.content, 'html.parser')
allTables = soup.find_all('table')
print(len(allTables))
这也只输出 2 个表。我将这一步更进一步,并尝试在原始 HTML 中进一步检查其中一个表,该表存在但未找到;在本例中,我将使用“Team Offense”表,该表有一个表标签和一个 ID“team_stats”。但是,此代码返回 0 个找到的表:
from bs4 import BeautifulSoup
import requests
url = 'https://www.pro-football-reference.com/years/2019'
r = requests.get(url)
soup = BeautifulSoup(r.content, 'html.parser')
allTables = soup.find_all('table', attrs={"id":"team_stats"})
print(len(allTables))
最后来到stackoverflow,发现如下问题/回复:
Pandas read_html missing some tables
因此,按照这些指示,我将 urllib.request 与 BeautifulSoup 和 Pandas 结合使用,并且应该能够得到结果...除了我 仍然只得到 2 个表:
import pandas as pd
from bs4 import BeautifulSoup
import urllib.request
html_text = urllib.request.urlopen("https://www.pro-football-reference.com/years/2019/#all_team_stats")
bs_obj = BeautifulSoup(html_text,features='lxml')
tables = bs_obj.findAll('table')
dfs = list()
for table in tables:
df = pd.read_html(str(table))[0]
dfs.append(df)
print(len(dfs))
这里有人能帮我弄清楚为什么这些方法都不起作用吗?可以清楚的看到这个页面有很多多于2个表,但是这些方法都找不到。
【问题讨论】:
-
页面是动态生成的,可能使用ajax。这意味着页面在被实际浏览器访问之前不会完全加载。你可能需要像 selenium 浏览器自动化这样的东西
标签: python pandas web-scraping beautifulsoup