Элемент не найден на странице с помощью запросов и BeautifulSoup - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь почистить сайт моей любимой футбольной команды колледжа.На веб-странице есть две таблицы, которые я хотел бы очистить, и написанный мной код легко очищает первую таблицу.Я могу поместить его в dataframe панды, а затем в Excel.По какой-то причине я не могу понять, что не могу соскрести второй стол (защитный стол) с сайта.Я пробовал несколько различных методов, чтобы очистить вторую таблицу.Я попытался просто найти все таблицы, который находит первую таблицу просто отлично, но не может найти вторую.Я попытался использовать перечисленные атрибуты в таблице, которые тоже не работали.Любая помощь будет принята с благодарностью!Ниже приведен код, который я использую для очистки второй таблицы:

from lxml import html
import requests
from bs4 import BeautifulSoup
import csv
import pandas as pd

game_summary = 'https://www.sports-reference.com/cfb/schools/iowa/2018/gamelog/'
game_summary_response = requests.get(game_summary, timeout=30)
game_summary_content = BeautifulSoup(game_summary_response.text, 'html.parser')
deffensive_table = game_summary_content.find('table', id='defense')
defensive_game_summary = deffensive_table.find_all('tr')

Когда я запускаю программу, я просто получаю следующую ошибку:

Traceback (most recent call last):
  File "ncaa_stats_scrape.sh", line 24, in <module>
    defensive_game_summary = deffensive_table.find_all('tr')
AttributeError: 'NoneType' object has no attribute 'find_all'

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Таблица, которую вы ищете, включена в возвращаемый HTML-код, но в виде HTML-комментария.Страница содержит некоторый JavaScript, который выполняется после загрузки страницы, чтобы раскомментировать таблицу, чтобы она отображалась.Самый простой способ получить содержимое - это использовать библиотеку, которая может выполнять JavaScript после извлечения страницы, например requests_html.Пример:

from requests_html import HTMLSession


url = 'https://www.sports-reference.com/cfb/schools/iowa/2018/gamelog/'
session = HTMLSession()
r = session.get(url)

r.html.render()

table = r.html.find('table#defense')
print(table.html)
0 голосов
/ 30 января 2019

Ошибка, которую вы опубликовали, в основном означает, что значение deffensive_table равно None.

. Поэтому, когда вы делаете find_all, вы получаете AttributeError.Возможным исправлением может быть проверка None перед

deffensive_table = game_summary_content.find('table', id='defense')
if deffensive_table is None:
    defensive_game_summary = deffensive_table.find_all('tr')
else:
    < some other logic to handle this case >
...