Многочисленные ошибки при очистке таблиц высшей лиги

Я изучаю веб-скрейпинг.

Мне удалось получить рейтинг лучших ютуберов с это в качестве эталона.

Я использую ту же логику для очистки PL-рейтинг, но имею две проблемы:

  1. он только собирает до 5-го места.
  2. это получение только первого места по результату
  3. а затем, получая ошибку атрибута:

error

    from bs4 import BeautifulSoup
    import requests
    import csv


    url = 'https://www.premierleague.com/tables'
    page = requests.get(url)
    soup = BeautifulSoup(page.content, 'html.parser')
    
    standings = soup.find('div', attrs={'data-ui-tab': 'First Team'}).find_all('tr')[1:]
    print(standings)
    
    file = open("pl_standings.csv", 'w')
    writer = csv.writer(file)
    
    writer.writerow(['position', 'club_name', 'points'])
    
    for standing in standings:
        position = standing.find('span', attrs={'class': 'value'}).text.strip()
        club_name = standing.find('span', {'class': 'long'}).text
        points = standing.find('td', {'class': 'points'}).text
    
        print(position, club_name, points)
    
        writer.writerow([position, club_name, points])
    
    file.close()
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
1
0
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что html.parser неправильно парсит страницу (попробуйте использовать парсер lxml). Кроме того, каждую секунду нужно получать <tr>, чтобы получить правильные результаты:

import requests
from bs4 import BeautifulSoup


url = "https://www.premierleague.com/tables"
page = requests.get(url)
soup = BeautifulSoup(page.content, "lxml") # <-- use lxml

standings = soup.find("div", attrs={"data-ui-tab": "First Team"}).find_all(
    "tr"
)[1::2]  # <-- get every second <tr>

for standing in standings:
    position = standing.find("span", attrs={"class": "value"}).text.strip()
    club_name = standing.find("span", {"class": "long"}).text
    points = standing.find("td", {"class": "points"}).text
    print(position, club_name, points)

Отпечатки:

1 Manchester City 77
2 Liverpool 76
3 Chelsea 62
4 Tottenham Hotspur 57
5 Arsenal 57
6 Manchester United 54
7 West Ham United 52
8 Wolverhampton Wanderers 49
9 Leicester City 41
10 Brighton and Hove Albion 40
11 Newcastle United 40
12 Brentford 39
13 Southampton 39
14 Crystal Palace 37
15 Aston Villa 36
16 Leeds United 33
17 Everton 29
18 Burnley 28
19 Watford 22
20 Norwich City 21

Могу я спросить, почему здесь html.parser не работает, а lxml работает?

Rabinzel 23.04.2022 12:20

@Rabinzel html.parses ведет себя по-другому, когда есть искаженный HTML. lxml ведет себя более стандартно в этом отношении. Для полного соответствия также есть html5lib, но он медленный (это компромисс между скоростью/правильностью)

Andrej Kesely 23.04.2022 12:23

Спасибо! так как кто-то, кто на самом деле не в html и хочет что-то очистить здесь и там (я бы не сразу заметил искаженный html), я лучше всего выбираю html5lib в качестве начала, а затем просто пробую другие, если производительность имеет значение, и сравниваю полученные результаты ?

Rabinzel 23.04.2022 12:27

@Rabinzel Когда вы очищаете всего несколько страниц / учитесь, вы можете без проблем использовать html5lib. Но когда вы пытаетесь парсить в масштабе, медлительность быстро увеличивается (но есть также модуль multiprocessing, который поможет).

Andrej Kesely 23.04.2022 12:31

хорошо спасибо. Я буду иметь это в виду.

Rabinzel 23.04.2022 12:43

Никогда не думал о проблеме с html.parser. Большое спасибо за помощь @AndrejKesely :)

jisoooh0202 23.04.2022 21:48

на всякий случай, для некоторых новичков, получающих другую ошибку с lxml, я сделал «pip install lxml», и это сработало. но также ссылки это и это имеют разные решения.

jisoooh0202 23.04.2022 22:12

Другие вопросы по теме