BeautifulSoup - Найти элементы непосредственно под заголовком и над определенной строкой - PullRequest
0 голосов
/ 22 ноября 2018

Как я могу очистить следующую структуру, чтобы получить только h3, класс h4 выше h5 string = "Prem League" и div class = "fixres_item" непосредственно под строкой h5 "Prem League".

Я бы хотелтекст из h3, h4 и внутри div. Мне нужен текст из span, внутри span

Так что, когда строка класса h5 - Prem League, я хочу, чтобы h4 и h3 находились непосредственно над ним, а также мне нужен гейт.различные элементы нашего fixres_item прямо под строкой класса h5 = Премьер-лига

<div class="fixres__body" data-url="" data-view="fixture-update" data-controller="fixture-update" data-fn="live-refresh" data-sport="football" data-lite="true" id="widgetLite-6">
    <h3 class="fixres__header1">November 2018</h3>          
    <h4 class="fixres__header2">Saturday 24th November</h4>             
    <h5 class="fixres__header3">Prem League</h5>
    <div class="fixres__item">stuff in here</div>

    <h4 class="fixres__header2">Wednesday 28th November</h4>
    <h5 class="fixres__header3">UEFA Champ League</h5>
    <div class="fixres__item">stuff in here</div>

    <h3 class="fixres__header1">December 2018</h3>          
    <h4 class="fixres__header2">Sunday 2nd December</h4>                
    <h5 class="fixres__header3">Prem League</h5>
    <div class="fixres__item">stuff in here</div>

Это код, который у меня есть, но он включает в себя данные из разделов ниже строки h5 "Лига чемпионов ЕСФА" - что я и делаюне хочу.Я только хочу получить данные от div, которые находятся ниже h5 под заголовком «Премьер-лига».Например, я не хочу, чтобы PSG отображался в выходных данных, потому что он исходит от div ниже заголовка h5 "Лига чемпионов ЕСФА"

Мой код -

def squad_fixtures():
    team_table = ['https://someurl.com/liverpool-fixtures']

    for i in team_table:

#        team_fixture_urls = [i.replace('-squad', '-fixtures') for i in team_table]

        squad_r = requests.get(i)
        premier_squad_soup = BeautifulSoup(squad_r.text, 'html.parser')
#        print(premier_squad_soup)
        premier_fix_body = premier_squad_soup.find('div', {'class': 'fixres__body'})
#        print(premier_fix_body)

        premier_fix_divs = premier_fix_body.find_all('div', {'class': 'fixres__item'})

    for i in premier_fix_divs:  
        team_home = i.find_all('span', {'class': 'matches__item-col matches__participant matches__participant--side1'})
        for i in team_home:
            team_home_names = i.find('span', {'class': 'swap-text--bp30'})['title']
            team_home_namesall.append(team_home_names)
    print(team_home_namesall)

Выход
['Watford',' PSG ',' Ливерпуль ',' Бернли ',' B'mouth ',' Ливерпуль ',' Ливерпуль ',' Волки ',' Ливерпуль ',' Ливерпуль ',' Man City ',' Брайтон ','Ливерпуль »,« Ливерпуль »,« Вест Хэм »,« Ливерпуль »,« Манчестер Юнайтед »,« Ливерпуль »,« Эвертон »,« Ливерпуль »,« Фулхэм »,« Ливерпуль »,« Со'тон »,« Ливерпуль », «Кардифф», «Ливерпуль», «Ньюкасл», «Ливерпуль»]

1 Ответ

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

Похоже, ваша задача ограничить очистку только до Premier League <h5> и связанного с ним содержимого.

Примечание. В вашем вопросе указано string из h5быть Prem League, но на самом деле это выглядит как Premier League, когда я смотрю на ответ.

Этот HTML выглядит довольно плоским и недифференцированным по структуре, поэтому он выглядит как лучшийэто пройти через братьев и сестер предыдущего и следующего от h5, который сам по себе довольно легко найти:

import re

from bs4 import BeautifulSoup, Tag
import requests

prem_league_regex = re.compile(r"Premier League")


def squad_fixtures():
    team_table = ['https://www.skysports.com/liverpool-fixtures']

    for i in team_table:
        squad_r = requests.get(i)
        soup = BeautifulSoup(squad_r.text, 'html.parser')
        body = soup.find('div', {'class': 'fixres__body'})
        h5s = body.find_all('h5', {'class': 'fixres__header3'}, text=prem_league_regex)
        for h5 in h5s:
            prev_tag = find_previous(h5)
            if prev_tag.name == 'h4':
                print(prev_tag.text)
            prev_tag = find_previous(prev_tag)
            if prev_tag.name == 'h3':
                print(prev_tag.text)
            fixres_item_div = find_next(h5)
            """
                get the things you need from fixres__item now that you have it...
            """



def find_previous(tag):
    prev_tag = tag.previous_sibling
    while(not isinstance(prev_tag, Tag)):
        prev_tag = prev_tag.previous_sibling
    return prev_tag

def find_next(tag):
    next_tag = tag.next_sibling
    while(not isinstance(next_tag, Tag)):
        next_tag = next_tag.next_sibling
    return next_tag
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...