我正在从espn.com抓取即将到来的NFL日程安排的数据。但是,我只能得到表的第一行,而不能得到其余的表。我相信这是因为html的结构,每个日期都有不同的“ td”。我可以获取周四的比赛数据,但其余的则不能。
**** 9月5日,星期四****
比赛时间(东部时间)NAT电视门票位置
绿湾
芝加哥
晚上8:20 NBC门票低至290美元,芝加哥士兵场
9月8日,星期日
比赛时间(东部时间)NAT电视门票位置
田纳西州
克利夫兰
1:00 PM CBS门票低至$ 121克利夫兰第一能源体育场
辛辛那提
西雅图
下午4:05 CBS门票低至$ 147 CenturyLink Field,西雅图
纽约
达拉斯
4:25 PM FOX门票价格低至$ 50 AT体育场,阿灵顿
福克斯伯勒
9月9日,星期一
比赛时间(东部时间)NAT电视门票位置
休斯顿
新奥尔良
7:10 PM新奥尔良ESPN门票低至$ 112 Mercedes-Benz Superdome
丹佛
奥克兰
10:20 PM ESPN门票低至$ 72奥克兰体育馆,奥克兰
我使用了beautifulsoup,很容易就可以获取数据,但是解析数据是一个挑战。
我试图继续使用for循环,但是我可以进行stopiteration追溯。阅读上一篇有关回溯的文章后,我意识到我需要尝试解决该问题的另一种解决方案。
import requests
from bs4 import BeautifulSoup
from urllib.parse import urlparse
import pandas as pd
main_url = ['http://www.espn.com/nfl/schedule'][1]
response = requests.get(main_url)
soup = BeautifulSoup(response.text, 'lxml')
table = soup.find('table')
rows = table.find_all('tr')
rows = iter(rows)
df = [td.text for td in next(rows).find_all('td') if td.text]
df2 = [td.text for td in next(rows).find_all('td') if td.text]
[1]: https://www.espn.com/nfl/schedule
答案 0 :(得分:0)
我认为问题出在这一行:
table = soup.find('table')
问题是,上述页面由3个具有table
属性的class = "schedule"
元素组成。但是,在您的代码中,您仅使用了find()
函数,而不是find_all()
。这就是您最终只使用第一个表的内容的主要原因。因此,我相信,只要正确处理该部分,您就可以顺利进行。现在,我对用于填充列表的设置符号不太熟悉,因此代码包含了不错的旧for
循环样式。
#List to store the rows
df = []
#Collect all the tables
tables = soup.find_all('table', class_ = "schedule")
for table in tables:
rows = soup.find_all('tr')
#rows = iter(rows)
row_item = []
for row in rows:
#Collect all 'td' elements from the 'row' & append them to a list 'row_item'
data_items = row.find_all('td')
for data_item in data_items:
row_item.append(data_item.text)
#Append the list to the 'df'
df.append(row_item)
row_item = []
print(df)
答案 1 :(得分:0)
如果您尝试提取<table>
标签,则可以使用熊猫.read_html()
来做到这一点。它将返回数据帧列表。在这种情况下,您可以将它们全部一起添加到1个表中:
import pandas as pd
url = 'http://www.espn.com/nfl/schedule'
tables = pd.read_html(url)
df = pd.DataFrame()
for table in tables:
df = df.append(table)