Как получить разные таблицы с одной страницы, используя Python (lxml, html, запросы, xpath)? - PullRequest
0 голосов
/ 01 января 2019

Я пытаюсь получить данные таблицы Премьер-лиги из https://www.premierleague.com/tables.Я могу получить данные с помощью приведенного ниже кода, но, к сожалению, он работает только для варианта последнего сезона ( 2018/2019 ).На этой странице представлены таблицы и для других сезонов ( 2017/2018, ...) , как мне почистить другие таблицы?

from lxml import html
import requests

page = requests.get('https://www.premierleague.com/tables')

tree = html.fromstring( page.content )

team_rows = tree.xpath('//table//tbody//tr[@data-filtered-table-row-name]')[0:20]
team_names = [i.attrib['data-filtered-table-row-name'] for i in team_rows] 

teams = {}

for i in range(20):
    element = team_rows[i]
    teams[team_names[i]] = element.getchildren()

for i in team_names:
    values = [j.text_content() for j in teams[i]]
    row = "{} "*9
    print( row.format(i, *values[3:12] ) )

1 Ответ

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

но, к сожалению, он работает только для опции последнего сезона (2018/2019)

Сайт использует JavaScript для загрузки старой таблицы (1992-2017), поэтому при использовании Pythonчтобы получить доступ к последней таблице.Если вы хотите очистить фильтр таблиц по годам / сессиям, я предоставлю вам версию жесткого кода (потому что я не нашел правило номера года).Но вы хотите завершить это более элегантно, селен или запросы_html может подойти для вас.

Примечание: Я имитирую данные, полученные с помощью JavaScript, с сервера, поэтому содержимое ответа имеет тип json.И он может получить только таблицу премьер-лиги другого года. Фильтр по соревнованию / matchweek / home_or_away недоступен в моем примере.Если вы хотите добавить эту опцию в скрипт, вам следует проанализировать правило параметра url (используйте способ, описанный @pguardiario, или использовать некоторые инструменты, такие как fiddler).

import requests
from pprint import pprint

years = {str(1991+i):str(i) for i in range(1,23)}
years.update({
    "2018":"210",
    "2017":"79",
    "2016":"54",
    "2015":"42",
    "2014":"27"
    })

specific = years.get("2017")

param = {
    "altIds":"true",
    "compSeasons":specific,
    "detail":2,
    "FOOTBALL_COMPETITION":1
}

headers = {
    "Origin": "https://www.premierleague.com",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",
    "Referer": "https://www.premierleague.com/tables?co=1&se={}&ha=-1".format(specific),
    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
    }

page = requests.get('https://footballapi.pulselive.com/football/standings',
                 params=param,
                 headers=headers
                 )
print(page.url)
pprint(page.json())

Как получить разные таблицыс одной страницы

Я чувствую, что название вашего вопроса отличается от вашего описания.Если это правда, другая проблема заключается в том, что вы объединяете все таблицы в одну.И вам следует позаботиться о // Что означает .// в XPath? .

Примечание: Если вы хотите получить старые данные Премьер-лигиТаблица, используйте мой код в 1-й части. Поскольку эти данные могут быть получены только таким образом.

from lxml import html
import requests
from pprint import pprint

years = {str(1991+i):str(i) for i in range(1,23)}
years.update({
    "2018":"210",
    "2017":"79",
    "2016":"54",
    "2015":"42",
    "2014":"27"
    })

param = {
    "co":"1",
    "se":years.get("2017"),
    "ha":"-1"
}


page = requests.get('https://www.premierleague.com/tables', params=param)

tree = html.fromstring( page.content )
tables = tree.xpath('//tbody[contains(@class,"tableBodyContainer")]')
each_table_team_rows = [table.xpath('tr[@data-filtered-table-row-name]') for table in tables]
team_names = [[i.attrib['data-filtered-table-row-name'] for i in team_rows] for team_rows in each_table_team_rows]

pprint(team_names)
...