Я пытаюсь очистить данные MLB от https://www.baseball-reference.com/leagues/MLB/2019.shtml. На странице есть несколько таблиц данных, особенно меня интересует статистика ватина и качки. Я могу успешно извлечь данные из таблицы ватина и поместить их в информационный кадр, но ошибка возникает, когда я пытаюсь извлечь данные из таблицы передачи, даже если форматирование в основном идентично:
from bs4 import BeautifulSoup
import pandas as pd
import time
import requests
for year in range(2018, 2020):
url = "https://www.baseball-reference.com/leagues/MLB/{}.shtml".format(year)
headers = {'user-agent': "Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11"}
page = requests.get(url, headers=headers)
soup = BeautifulSoup(page.text, 'html.parser')
batting_table = soup.find("div", attrs={"id": "div_teams_standard_batting"})
pitching_table = soup.find("div", attrs={"id": "div_teams_standard_pitching"})
Я на 100% убедитесь, что HTML ссылки верны. batting_table это хорошо, но pitching_table это "NoneType". Я понимаю, что некоторые проблемы могут быть связаны со структурой самой страницы html, но возможно ли это в этом случае?
Не уверен, что это полезно, но я использую в этих функциях те таблицы, которым передаю статистику c, которую я хочу получить из каждой команды, а затем помещаю ее в список. Здесь я использую «find_all», и появляется ошибка:
def batting_stats(bstat):
tables = batting_table.find_all("td", attrs={"data-stat": bstat})
b_stats = []
for table in tables:
b_stat = table.text
b_stat = float(b_stat)
b_stats.append(b_stat)
b_stats = b_stats[:-2] #exclude total and average
return b_stats
def pitching_stats(pstat):
tables = pitching_table.find_all("td", attrs={"data-stat": pstat})
p_stats = []
for table in tables:
p_stat = table.text
p_stat = float(p_stat)
p_stats.append(p_stat)
p_stats = p_stats[:-2]
return p_stats
Я надеюсь, что это не просто небольшая опечатка с моей стороны, которую я упустил из виду, что было бы крайне неприятно.
Заранее всем спасибо за помощь.
РЕДАКТИРОВАТЬ: Так что благодаря Dainius я смог найти решение! Я не сделал в точности то, что было предложено в приведенной ими ссылке, но это помогло мне понять, что по какой-то причине таблица изменений была прокомментирована в HTML, что было неочевидно при просмотре веб-страницы, поэтому я был смущен Дайниусом ' Ответить.
Что показывает Inspect
Я не осознавал, пока не напечатал «суп» и, наконец, не понял, что они имели в виду. После быстрого поиска того, как извлечь комментарии из HTML, решение было просто добавить две строки кода:
comments = soup.find_all(text=lambda text: isinstance(text, Comment))
pitching_html = comments[19]
pitching_table = BeautifulSoup(pitching_html, 'lxml')