Как очистить статистику НХЛ с помощью Xpath? - PullRequest
0 голосов
/ 03 ноября 2018

Я пытаюсь очистить статистику фигуристов НХЛ 2017/2018. Я начал с кода, но у меня возникают проблемы с анализом данных и печатью, чтобы преуспеть.

Вот мой код:

#import modules 

from urllib.request import urlopen
from lxml.html import fromstring

import pandas as pd

#connect to url

url = "https://www.hockey-reference.com/leagues/NHL_2018_skaters.html"

#remove HTML comment markup

content = str(urlopen(url).read())
comment = content.replace("-->","").replace("<!--","")
tree = fromstring(comment)

#setting up excel columns

columns = ("names", "gp", "g", "s", "team")
df = pd.DataFrame(columns=columns)    

#attempt at parsing data while using loop    

for nhl, skater_row in enumerate(tree.xpath('//table[contains(@class,"stats_table")]/tr')):
    names = pitcher_row.xpath('.//td[@data-stat="player"]/a')[0].text
    gp = skater_row.xpath('.//td[@data-stat="games_played"]/text()')[0]
    g = skater_row.xpath('.//td[@data-stat="goals"]/text()')[0]
    s = skater_row.xpath('.//td[@data-stat="shots"]/text()')[0]
    try:
        team = skater_row.xpath('.//td[@data-stat="team_id"]/a')[0].text

    # create pandas dataframe to export data to excel

    df.loc[nhl] = (names, team, gp, g, s)

#write data to excel

writer = pd.ExcelWriter('NHL skater.xlsx')
df.to_excel(writer, 'Sheet1')
writer.save()

Может кто-нибудь объяснить, пожалуйста, как анализировать эти данные? Есть ли какие-то советы, которые помогут вам написать Xpath, чтобы я мог просматривать данные?

У меня проблемы с написанием строки:

for nhl, skater_row in enumerate(tree.xpath...

Как вы нашли Xpath? Вы использовали Xpath Finder или Xpath Helper?

Также я столкнулся с ошибкой в ​​строке:

df.loc[nhl] = (names, team, gp, g, s)

Показывает неверный синтаксис для df.

Я новичок в изучении веб-страниц и не имею опыта программирования. Любая помощь будет принята с благодарностью. Заранее спасибо за ваше время!

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Если вы все еще хотите придерживаться XPath и получать только необходимые данные вместо фильтрации полных данных, попробуйте следующее:

for row in tree.xpath('//table[@id="stats"]/tbody/tr[not(@class="thead")]'):
    name = row.xpath('.//td[@data-stat="player"]')[0].text_content()
    gp = row.xpath('.//td[@data-stat="games_played"]')[0].text_content()
    g = row.xpath('.//td[@data-stat="goals"]')[0].text_content()
    s = row.xpath('.//td[@data-stat="shots"]')[0].text_content()
    team = row.xpath('.//td[@data-stat="team_id"]')[0].text_content()

Выход print(name, gp, g, s, team):

Justin Abdelkader 75 13 110 DET
Pontus Aberg 53 4 70 TOT
Pontus Aberg 37 2 39 NSH
Pontus Aberg 16 2 31 EDM
Noel Acciari 60 10 66 BOS
Kenny Agostino 5 0 11 BOS
Sebastian Aho 78 29 200 CAR
...
0 голосов
/ 03 ноября 2018

IIUC: это можно сделать с помощью BeautifulSoup и pandas read_html

import requests
import pandas
from bs4 import BeautifulSoup

url = 'https://www.hockey-reference.com/leagues/NHL_2018_skaters.html'
pg = requests.get(url)
bsf = BeautifulSoup(pg.content, 'html5lib')
tables = bsf.findAll('table', attrs={'id':'stats'})
dfs = pd.read_html(tables[0].prettify())
df = dfs[0]

Результирующий информационный кадр будет иметь все столбцы в таблице и использовать панды для фильтрации необходимых столбцов.

#Filters only columns 1, 3 and 5 similarly all required columns can be filtered.
dff = df[df.columns[[1, 3, 5]]]
...