BeautifulSoup - элемент, показывающий только первый результат несколько раз - PullRequest
1 голос
/ 11 июля 2020

В настоящее время я пытаюсь очистить данные футбольных матчей со следующего URL-адреса:

https://liveonsat.com/uk-england-all-football.php

Я могу очистить названия матчей, время начала и имена каналов правильно. К сожалению, у меня возникла проблема с определением правильной даты матча. Ранее я определил с помощью stackoverflow, что элемент, содержащий дату совпадения, может быть вызван с помощью

parent.find

Проблема, с которой я столкнулся, заключается в том, что первая очищенная дата сохраняется во всех очищенных совпадениях даже если конкретная игра не в этот день. Например, если я запускаю код сегодня, он показывает дату совпадения для всех совпадений как суббота, 11 июля, даже если некоторые совпадения, которые были очищены, относятся к разным датам.

На данный момент я не уверен, что проблема может быть, и был бы чрезвычайно благодарен, если бы кто-нибудь мог мне помочь или указать мне правильное направление, чтобы попытаться решить эту проблему. Сначала я подумал, что проблема связана с элементом HTML, который был выбран для получения даты совпадения, но я изменил это на предыдущие родительские элементы для тестирования, и дата не очищается вообще, поэтому кажется, что элемент, выбранный в настоящее время для Дата сбора данных верна, но, возможно, я неправильно ее реализовал.

Чтобы помочь, я оставил комментарий рядом с элементом даты матча, с которым у меня возникла проблема.

import requests
import time
import csv
import sys
from bs4 import BeautifulSoup
import tkinter as tk
from tkinter import messagebox
from tkinter import *
from PIL import ImageTk, Image


def makesoup(url):
    page=requests.get(url)
    return BeautifulSoup(page.text,"lxml")
   
    
    
def matchscrape(g_data):
    for match in g_data:
    
        competitors = match.find('div', class_='fix').text
        match_date = match.parent.find('h2',class_='time_head').text # this is used to scrape the match date as it is not contained within "div", {"class": "blockfix"}))

        match_time = match.find('div',class_='fLeft_time_live').text.strip()
        print("Competitors ", competitors) 
        print("Match date", match_date)
        print("Match time", match_time)
            
    #Match time
        channel = match.find_all("td", {"class": "chan_col"})
        for i in channel:
                print(i.get_text().strip())
        
            
            
def matches():
    soup=makesoup(url = "https://liveonsat.com/uk-england-all-football.php")
    matchscrape(g_data = soup.findAll("div", {"class": "blockfix"}))

    
        
        
root = tk.Tk()
root.resizable(False, False)
root.geomAetry("600x600")
root.wm_title("liveonsat scraper")
Label = tk.Label(root, text = 'liveonsat scraper', font = ('Comic Sans MS',18))
button = tk.Button(root, text="Scrape Matches", command=matches)
button3 = tk.Button(root,  text = "Quit Program", command=quit)
Label.pack()
button.pack()
button3.pack()
status_label = tk.Label(text="")
status_label.pack()
root.mainloop()

Ниже приведен соответствующий пример HTML код сайта, который я сканирую:

<div style="clear:right">    <div class=floatAndClearL><h2 class = sport_head >Football</h2></div>  <!-- sport_head -->
    <div class=floatAndClearL><h2 class = time_head>Saturday, 11th  July</h2></div> <!-- time_head -->         <div><span class = comp_head>English Championship - Week 43</span></div>
       <div class = blockfix >                <!-- block 1-->
    <div class=fix>                 <!-- around fixture and notes 2-->
          <div class=fix_text>               <!-- around fixture text 3-->
              <div class = imgCenter><span><img src="../img/team/england.gif"></span></div>
              <div class = fLeft style="width:270px;text-align:center;background-color:#ffd379;color:#800000;font-size:10pt;font-family:Tahoma, Geneva, sans-serif">Derby County v Brentford</div>
              <div class = imgCenter><img src="../img/team/england.gif"></div>
    </div>                  <!-- around fixture text 3 ENDS-->
        <div class=notes></div>
     </div>                  <!-- around fixture and notes 2 ENDS-->

            <div class = fLeft>                <!-- around all of channel types 2-->     <div>             <!-- around channel type group 3-->
       <div class=fLeft_icon_live_l>       <!-- around icon 4-->
         <img src="../img/icon/live3.png"/>
       </div>
       <div class=fLeft_time_live>       <!-- around icon 4-->
         ST: 12:30
       </div>           <!-- around icon 4 ENDS-->        <div class = fLeft_live>       <!-- around all tables of a channel type 4-->       <table border="0" cellspacing="0" cellpadding="0"><tr><td class=chan_col>&nbsp; <a href="https://connect.bein.net/" target="_blank"  class = chan_live_iptvcable>              beIN Connect MENA ?</a></td><td width = 0></td>
                    </tr></table>       <table border="0" cellspacing="0" cellpadding="0"><tr><td class=chan_col>&nbsp; <a href="https://tr.beinsports.com/kullanici/giris?ReturnUrl=" target="_blank"  class = chan_live_iptvcable>              beIN Connect TURKEY ?</a></td><td width = 0></td>
                   

1 Ответ

1 голос
/ 11 июля 2020

Вместо find.parent используйте .find_previous(), потому что parent является общим (и, следовательно, одинаковым) для всех <div class="blockfix">:

import requests
from bs4 import BeautifulSoup


url = 'https://liveonsat.com/uk-england-all-football.php'
soup = BeautifulSoup(requests.get(url).content, 'html.parser')


for match in soup.select('div.blockfix'):
    competitors = match.find('div', class_='fix').text.strip()
    match_date = match.find_previous('h2', class_='time_head').text.strip() # <-- use .find_previous()
    match_time = match.find('div',class_='fLeft_time_live').text.strip()
    channels = match.select('.chan_col')
    print("Competitors ", competitors)
    print("Match date", match_date)
    print("Match time", match_time)
    print('Channels:\n\t' + '\n\t'.join(c.get_text(strip=True) for c in channels))
    print('-' * 80)

Выводит:

Competitors  Derby County v Brentford
Match date Saturday, 11th  July
Match time ST: 13:30
Channels:
    beIN Connect MENA 📺
    beIN Connect TURKEY 📺
    beIN Sports MENA 5 HD
    beIN Sports Turkey 4 HD
    Eleven Sports 1 Portugal HD
    Nova Sport (serbia) HD
    Nova Sports 1 HD (Cyprus)
    Nova Sports 1 HD (Hellas)
    Sky Sports Football UK / HD
    Sport 4 Israel / HD
    Sportdigital TV HD
    SportsMax 2 HD
    Stöd 2 Sport 2 / HD
    SuperSport 9 RSA
    Telekanal Futbol
    TV3 Sport HD Sweden
    V Sport 1 HD (norge)
    V Sport Extra HD (sweden)
    ViaPlay (denmark) / HD
    ViaPlay (finland) / HD
    ViaPlay (norway) / HD
    ViaPlay (sweden) / HD
--------------------------------------------------------------------------------
Competitors  Watford v Newcastle United
Match date Saturday, 11th  July
Match time ST: 13:30
Channels:
    Amazon Prime UK Only [$]
    beIN Connect MENA 📺
    beIN Sports MENA 12 HD
    beIN Sports MENA 2 HD
    Belarus 5 TV
    Canal+ Now HD (poland)
    Cosmote Sport 7 HD
    Cytavision Sports 1 HD
    DAZN Canada [$] (geo/R)
    DAZN España [$] (geo/R)
    Diema Sport 2 HD
    ESPN Brasil HD
    EuroSport 1 Romania / HD
    Premier Sports 1 HD (ROI only)
    QazSport / HD
    RMC Sport 2 HD
    Setanta Qazaqstan HD
    Setanta Sports Ukraine+ HD
    Sky Sport 1 / HD Germany
    Sky Sport Arena Italia / HD
    Sky Sport Austria 1 HD
    Sky Sport Football Italia / HD
    Sport 2 Israel / HD
    Sport TV2 (portugal) / HD
    SportKlub 2 (serbia) HD
    Spíler 1 TV / HD
    SuperSport 4 RSA / HD
    TRT Spor / HD 📺
    TSN Malta 2 HD
    TV2 Sport Premium 2 HD
    TV2sumo.no [$] (geo/R)
    TV3 MAX (denmark) / HD
    V Sport Premium HD
    V Sport Urheilu / HD
    ViaPlay (denmark) / HD
    ViaPlay (finland) / HD
    ViaPlay (sweden) / HD
    VOOsport World 1 / HD
--------------------------------------------------------------------------------

... and so on.
...