我正在尝试抓取我最喜欢的大学橄榄球队的网站。我想抓取网页上的两个表格,而我编写的代码很容易抓取第一个表格。我能够将其放入pandas数据框中,然后放入Excel。由于某种原因,我无法弄清楚我无法从站点中刮出第二张桌子(防御桌子)。我尝试了多种方法来刮擦第二张桌子。我试过只查找所有表,这发现第一个表很好,但是找不到第二个表。我尝试使用表上列出的属性,但也没有用。任何帮助将不胜感激!下面是我用来刮取第二张表的代码:
from lxml import html
import requests
from bs4 import BeautifulSoup
import csv
import pandas as pd
game_summary = 'https://www.sports-reference.com/cfb/schools/iowa/2018/gamelog/'
game_summary_response = requests.get(game_summary, timeout=30)
game_summary_content = BeautifulSoup(game_summary_response.text, 'html.parser')
deffensive_table = game_summary_content.find('table', id='defense')
defensive_game_summary = deffensive_table.find_all('tr')
运行程序时,我只会收到以下错误:
Traceback (most recent call last):
File "ncaa_stats_scrape.sh", line 24, in <module>
defensive_game_summary = deffensive_table.find_all('tr')
AttributeError: 'NoneType' object has no attribute 'find_all'
答案 0 :(得分:1)
您发布的错误基本上意味着deffensive_table
的值为None
。
这就是为什么当您对此执行find_all
时会得到AttributeError
的原因。可能的解决方法是先进行None
检查
deffensive_table = game_summary_content.find('table', id='defense')
if deffensive_table is None:
defensive_game_summary = deffensive_table.find_all('tr')
else:
< some other logic to handle this case >
答案 1 :(得分:1)
您要查找的表包含在返回的HTML中,但作为HTML注释。该页面包含一些JavaScript,这些JavaScript在页面加载后执行以取消注释表,从而显示该表。获取内容的最简单方法是使用一个可以在检索页面后执行JavaScript的库,例如requests_html
。示例:
from requests_html import HTMLSession
url = 'https://www.sports-reference.com/cfb/schools/iowa/2018/gamelog/'
session = HTMLSession()
r = session.get(url)
r.html.render()
table = r.html.find('table#defense')
print(table.html)