Выберите последнюю таблицу или строку таблицы на странице для анализа с помощью Beautiful Soup - PullRequest
0 голосов
/ 01 августа 2020

Я просматриваю журналы / статистику игр (бейсболистов) каждый день. На странице игрока есть разные таблицы для каждого месяца, но все они имеют одинаковые идентификаторы / метки в коде HTML. Текущий код ниже находит все таблицы, а затем циклически просматривает их, чтобы найти строку с сегодняшней датой, чтобы захватить одну новую строку данных. Как можно изменить его, чтобы перейти к последней строке таблицы на странице и прочитать ее в todaystats, когда дата равна date_today? Или, по крайней мере, перейти к последней таблице на странице, прежде чем она начнет циклически перемещаться по строкам, чтобы найти таблицу с сегодняшней датой?

tables = urllib.request.urlopen(URL).read()
soup = BeautifulSoup(tables, 'html.parser')
tables = soup.find_all('table')
dfpitcher = pd.read_html(str(tables), flavor="bs4")
for i, df in enumerate(dfpitcher):
     df.columns = ['Date', 'Opponent', 'ERA', 'Result', 'PA', 'IP', 'H', 'HR', 'BB', 'HBP', 'K', 'R', 'ER', 'OAVG']
     todaystats = df.loc[df['Date'] == date_today]

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Просто используйте pandas, чтобы захватить последнюю таблицу, затем сопоставьте дату:

import pandas as pd
from datetime import datetime

date_today = float(datetime.today().strftime('%m.%d'))

url = 'http://eng.koreabaseball.com/Teams/PlayerInfoHitter/GameLogs.aspx?pcode=50923'
df = pd.read_html(url)[-1]
todaystats = df.loc[df.iloc[:,0] == date_today]
0 голосов
/ 01 августа 2020

Этот скрипт найдет строку, соответствующую текущей дате. Если строка не найдена, выводится сообщение об ошибке:

import requests
from bs4 import BeautifulSoup
from datetime import datetime


url = 'http://eng.koreabaseball.com/Teams/PlayerInfoHitter/GameLogs.aspx?pcode=50923'
soup = BeautifulSoup(requests.get(url).content, 'html.parser')
date_now = datetime.strftime(datetime.now(), '%m.%d')

row = soup.select_one('tr:has(td:contains("{}"))'.format(date_now))
if row:
    tds = [td.get_text(strip=True) for td in row.select('td')]
    print(*tds, sep='\t')
else:
    print('Row for current date {} not found!'.format(date_now))

Печать:

08.01   DOOSAN  0.667   3   1   2   0   0   1   1   1   0   0   0   1   0

Если вы хотите напечатать только последнюю строку:

row = soup.select('tr')[-1]
tds = [td.get_text(strip=True) for td in row.select('td')]
print(*tds, sep='\t')
...