如何从NFL日程表中抓取所有的td和tr数据

时间:2019-06-23 23:34:00

标签: python html web-scraping beautifulsoup

我正在从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

2 个答案:

答案 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)