Python Ошибка атрибута: «Объект NoneType не имеет атрибута find_all» для одной таблицы, но не для другой - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь очистить данные 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')

1 Ответ

0 голосов
/ 22 апреля 2020

Как я вижу, идентификатор div_teams_standard_pitching находится внутри комментария. Вам нужно проанализировать текст исходного кода, чтобы получить нужную вам часть. Потому что вы используете BeautifulSoup Я думаю, что это решение должно помочь.

PS вам потребуется другой селектор для разбора данных, потому что он будет представлен в виде текста.

Решение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...