Как получить все данные td и tr из расписания НФЛ - PullRequest
1 голос
/ 24 июня 2019

Я собираю данные с espn.com для предстоящего расписания НФЛ.Тем не менее, я могу получить только первую строку таблицы, а не остальные таблицы.Я полагаю, что это из-за структуры HTML, и каждая дата имеет разные «тд».Я могу получить данные игры в четверг, но не остальные

**** Четверг, 5 сентября **** ВРЕМЯ МАТЧЕПОВ (ET) РАСПОЛОЖЕНИЕ БИЛЕТОВ НА ТЕЛЕВИЗОР Грин Бэй
Чикаго 20:20 Билеты на NBCвсего $ 290 Солдат Филд, Чикаго
Воскресенье, 8 сентября ВРЕМЯ МАТЧЕПА (ET) РАСПОЛОЖЕНИЕ БИЛЕТОВ НА ТЕЛЕВИЗОР Теннесси
Кливленд 13:00 CBS Билеты всего за 121 $ Стадион FirstEnergy, Кливленд

Цинциннати
Сиэтл 16:05 CBS Билеты всего за 147 долларов США CenturyLink Field, Сиэтл
Нью-Йорк
Даллас 16:25 FOX Билеты всего за 50 долларов на стадионе AT & T, Арлингтон Фоксборо Понедельник, 9 сентября ВРЕМЯ МАТЧЕПА (ET) РАСПОЛОЖЕНИЕ БИЛЕТОВ НА ТЕЛЕВИЗОР NAT Хьюстон, Новый Орлеан, 19:10 ESPN Билеты всего за 112 долларов Mercedes-Benz Superdome, Новый Орлеан
Денвер
Окленд 22:20 ESPNБилеты всего за 72 доллара. Оклендский Колизей, Окленд.

Я пользовался Beautifulsoup и собирался получить данные, но анализ данных был затруднен.

Я пытался просто продолжитьиспользуя цикл for, но я могу отслеживать обратный ход остановки.Прочитав предыдущую статью об отслеживании, я понимаю, что мне нужно попробовать другое решение проблемы.

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 голосов
/ 24 июня 2019

Если вы пытаетесь извлечь теги <table>, вы можете использовать Pandas .read_html() для этого. Он вернет список данных. В этом случае вы можете сложить их все вместе в одну таблицу:

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)
0 голосов
/ 24 июня 2019

Я считаю, что проблема заключается в этой строке:

table = soup.find('table')

Дело в том, что вышеупомянутая страница состоит из 3 table элементов, которые имеют атрибут class = "schedule". Однако в вашем коде вы использовали только функцию find() вместо find_all(). Это главная причина, по которой вы получили только содержимое первой таблицы. Так что я верю, что если правильно справиться с этой частью, вам будет хорошо. Теперь я не очень хорошо знаком с нотацией set, используемой для заполнения списков, поэтому код содержит старый добрый стиль цикла 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...